Ich glaub mein PC ist zu schnell...
-
Hi,
ich schreibe ein Client/Server Programm über TCP/IP Sockets. Der Server ist ne Linux Maschiene, der Client Windows XP.
So jetzt mein Problem:
Ich möchte gerne 5 mal hinter einander etwas senden, was nur geringfügig anders ist. Diese 5 Sachen sollen beim Client in ein CTreeCtrl eingetragen werden.Dies ist auch kein Thema, doch leider kommen nur zwei Nachrichten an.Server:
struct SGameServer { char IP[15]; }GameServer[5]; int x; for(x=1;x<=5;x++) { pMySocket->SocketSend(socket,GameServer[x].IP,16); //pMySocket ist meine Klasse dort habe ich die normale send Funktion eingekapselt. }
so un nun der Client
char buffer[100], int x; for(x=1;x<=5;x++) { pSocket->Recv(buffer,sizeof(buffer),0); //Dies ist die AsyncSocket Klasse der MFC AfxMessageBox(buffer); }
so das struct SGameServer wird im am Anfang der main funktion mit werten befüllt. So das dort 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 drin steht. Wenn ich die Structur per Printf ausgeben lassen, werden alle Werte korrekt angezeigt. Somit liegt dort der Fehler schonmal nicht.
Ist es nicht eigentlich so das Send darauf wartest das die Gegenseite eine Recv Session geöffnet hat? Bzw revcv auf einen Send wartet?
Mir kommt es so vor als wenn Send einfach die 5 Nachrichten lossendet und überhaupt nciht guckt ob beim Client jemand zum Empfangen bereit ist. Kann das sein? Wenn ja wie kann ich trotzdem meine 5 Sachen senden und empfangen?
-
nur nebenbei:
GameServer[5]; for(x=1;x<=5;x++)
entweder du machst Dein GameServer - Array 6 groß und überspringst die null, oder lieber for(x=0;x<5;x++).
Das aber nur am Rande. Ansonsten sollte es funktionieren, wenn Deine Socketverbindung richtig aufgebaut ist.
Den Defaultparameter beim Receive (0) kannst du auch weglassen. Warum eigentlich das Recv in 'ner Schleife, wenn doch ehh nichts Schleifenspezifisches geändert wird. Überschreibe doch zu Empfangen Die schicke Funktion CAsyncSocket::OnReceive, um Daten, die gesendet wurden auszulesen.
-
hm hab das mit der onReceive Methode auch schon probiert, doch leider klappt das auch nicht. Es werden auch nur die ersten beiden gesendet.
-
Wenn du auf Daten wartet dann mache die Schleife solange bis keine Daten mehr ankommen.
Dann kann dir auch nicht passieren das nicht alle Daten da sind.
Woher willst du wissen ob es 5 Packete gibt. Nur weil du 5 Mal send machst?
Das entscheidet dein TCP-IP-STack wie er die verssendet. SOlltest du innerhalb von wenigen Millisekunden liegen dann werden alle Daten z.B. in ein Packet verpackt wenn sie in die MTU-Size passen.
Weiters fehlt hier Fehlerbehebung. Was wenn Recv eine Fehler hat? Sowas baut man gleich ein um bestimmte Fehler schonmal auzuschließen.
-
wenn das ganze getrennt werden soll musste UDP nehmen, TCP ist nicht anderes als ein Netzwerkstream!