Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

21

15.11.2007, 19:20

Zitat von »"RebornX"«


ich weiß ich weiß, um C++ richtig zu können muss man auch englisch gut können...
Aber verdammt ich bin erst 17!!!

gewöhn dich an die Sichtweise von 'schon 17 und immernoch kein gutes Englisch' statt 'erst 17, da kann man halt noch nich alles' ;)

22

15.11.2007, 19:35

Zitat von »"grek40"«

Zitat von »"RebornX"«


ich weiß ich weiß, um C++ richtig zu können muss man auch englisch gut können...
Aber verdammt ich bin erst 17!!!

gewöhn dich an die Sichtweise von 'schon 17 und immernoch kein gutes Englisch' statt 'erst 17, da kann man halt noch nich alles' ;)


jaa das sagen meine Eltern auch immer -.- rofl ...

Egal, ich habe jetzt einen Thread erstellt, klappt auch ganz gut aba irgendwas habe ich in der Schleife falsch gemacht und finde den Fehler einfach nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DWORD WINAPI ThreadFunktion(LPVOID param)
{
    while(test2 == SOCKET_ERROR)
    {
        test2 = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
        if(test2 == SOCKET_ERROR)
        {
            AddText("Fehler: Connection gescheitert!");
            Sleep(1000);
        }
        else
        {
            AddText("Verbunden mit 127.0.0.1 .!");
            return 1;
        }
    }
    return 0;
}


Also wenn man den Server zuerst an macht und danach den Clienten, dann funktioniert auch alles richtig. Also er sagt:
"Verbunden mit 127.0.0.1 .!"

Aber wenn ich zuerst den Clienten an mache und danach den Server, dann sagt er immer: "Fehler: Connection gescheitert!"
Doch der Server sagt das eine Verbindung akzeptiert wurde und der Client hat sogar "Hallo" geschickt, obwohl der Client die ganze zeit "Fehler: Connection gescheitert!" ausgibt -.-

Also irgendwie ist das komisch.... Liegt es evtl daran das die variable "test2" global ist??? Aber local kann ich da keine Variale anlegen....

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

23

15.11.2007, 22:43

Auf jedenfall sollte test2 nicht global sein! Genau wie anderen Variablen die du in deinem Thread verwendest.
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

24

16.11.2007, 13:26

Warum versucht ihr es nicht über SetTimer und WM_TIMER? Weil der Thread ist zwar eine Lösung bringt aber auch viele Probleme mit sich....

P.S: allerdings weiß ich nicht, ob das kurzzeitig das Fenster einfriert, wenn der auf den Timeout für das connect wartet.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

25

16.11.2007, 13:37

Zitat von »"Nox"«

Warum versucht ihr es nicht über SetTimer und WM_TIMER? Weil der Thread ist zwar eine Lösung bringt aber auch viele Probleme mit sich....


So viel Probleme werden in dem Fall nicht auftreten.
@D13_Dreinig

26

16.11.2007, 17:10

Sooo..... Habe Problem gelöst (Aber habe wieder ein weiteres Problem, siehe unten):

Wenn ich zuerst WSAAsyncSelect() aufgerufen habe und danach connect(), dann sendet er IMMER eine FD_CONNECT Message.
ABER wenn ein Fehler beim Verbinden aufgetreten ist, dann füllt er den WORD: wError = WSAGETSELECTERROR(lParam); mit dem error.

Und dann kann man das ganz einfach mit einer if Anweiung checken:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
case FD_CONNECT:

                            if (wError)
                               {
                                    AddText("Warte auf Verbindung");
                                    connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
                                    return TRUE ;
                               }
                               
                                AddText("Verbunden mit 127.0.0.1 .!");
                                return 0;


Ohne das ich irgendwelche threads oder Schleifen brauche, weil FD_CONNECT ja immer aufgerufen wird sobald man die Funktion connect() ausgeführt hat^^

Jedoch bin ich mir nicht ganz Sicher was das angeht weil bei FD_CLOSE klappt das dummerweise nicht -.-

C-/C++-Quelltext

1
2
3
                        case FD_CLOSE:
                            AddText("Verbindung abgebrochen!");
                            connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));


Weil Wenn Client und Server miteinander verbunden sind und der Server plötzlich off geht, dann muss der Client ja weiter prüfen ob eine Verbindung besteht , falls der Server wieder online geht
Aber wenn ich in der message connect() ausführe, dann wird komischerweise keine FD_CONNECT Nachricht geschickt
Weiß vllt einer woran das liegen kann???

27

16.11.2007, 17:58

Ich habe jetzt mal die Rückgabewerte mit WSAGetLastError() gecheckt:

naja als erstes gabs den Fehler:

Zitat

Socket is already connected.

Dann habe ich closesocket(s) aufgerufen, danach hatte ich gleich nen Weiteren Fehler:

Zitat

Socket operation on nonsocket.

Dann habe ich Socket s nochmal neu erstellt und jetzt kriege ich die richtige fehlermeldung:

Zitat

Connection refused.

ABER FD_CONNECT WIRD TRODSTEM NICHT GESENDET!!!!
MAN langsam werde ich hier.....

Ka was ich jetzt machen soll.... hat vllt jemand eine Idee??

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

28

16.11.2007, 18:15

Vergiss das mit den thread erstmal so wie du es grade machst. Du solltest dich informieren, wie man einen pc anpingt. Das ganze packst du dann in einen thread rein. je nachdem ob du mehrere server hast, musst du nen zeiger auf ne liste übergeben. wenn du gerne mehrere parameter übergeben würdest nimm ne struktur.

Falls das ein spiel werden soll...
jedes Spiel mit einem online-modus hat einen "masterserver". Alle spieleserver auf denen man dann zocken kann connecten zu diesem server die clients auch(i.d.r. wenn du auf multiplayer klickst). Die server melden sich als server an und die clients als clients. so wenn ein server connected wird er einfach in die serverliste aufgenommen(mit ip etc). eine verbindung wird meist auch gehalten oder es wird nen ping zu diesem server gesetzt(wenn länger nicht erreichbar wird er aus der liste genommen oder markiert). wenn nun ein client connected, wird ihm die komplette serverliste zugesendet. die wird dann meist angezeigt. dann kann man zu nem server connecten. fertig ich hoffe das war gut erklärt ist eigentlich ganz einfach aber schwer zu erklären da es mehrere arten von servern gibt.

Naja wenn du günstig an nen vserver ran kommst ist es hilfreich einen solchen masterserver dort laufen zu lassen.

Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

29

16.11.2007, 18:37

Anpingen ist keine gute Idee, seite ICMP ausschaltbar ist.
@D13_Dreinig

30

16.11.2007, 18:49

Was? Wie? Warum anpingen???

Der Server ist offline!

Ok.... ich erkläre es nochmal:

Also nehmen wir mal an, dass der Client mit dem Server verbunden ist.
dann geht der Server plötzlich offline (wegen absturtzt oda so...) und der Client kriegt eine FD_CLOSE Nachricht.
Mein client macht danach nixx mehr, dh er versucht gar nicht nochmal zu verbinden^^ und das ist nicht gut -.-
Weil wenn der Server gleich danach wieder online geht, checkt der Client das nicht weil er nicht mehr connect()et ^^ und man muss den ganzen Clienten neu starten um wieder mit den Server zu verbinden^^

C-/C++-Quelltext

1
2
3
4
5
                        case FD_CLOSE:
                            AddText("Verbindung abgebrochen!");
                            closesocket(s);
                            ConnectSocket();
                            ZahlFehlerPrüfung(WSAGetLastError());


So und mein Problem ist jetzt, dass nachdem ich connect() in der FD_CLOSE Message ausgeführt habe, NICHT die FD_CONNECT Message gesendet wird, obwohl das normalerweise funktionieren sollte....

Werbeanzeige