Winsock UDP Kommunikation verschluckt sich manchmal
-
Hallo!
Ich bin mir nicht ganz sicher, ob ich das im richtigen Unterforum poste, aber da es kein eigenes Netzwerk-Forum gibt, habe ich es hier hingeschrieben.
Ich habe eine kleine Client-Server Anwendung geschrieben die mittels UDP Paketen kommuniziert.
Der Server funktioniert im groben so, dass er einen listen-Socket aufsetzt, ihn an einen Port bindet. Dann geht er in eine Endlosschleife (main loop?) in der den Socket in einen message-Socket kopiert, auf diesem er dann recvfrom() aufruft:
int retval = recvfrom(_msgsock, Buffer, sizeof(Buffer), 0, (struct sockaddr*) &_from, &_fromlen);Den empfangenen String parsed er, und ruft je nach String eine entsprechende Antwort funktion auf.
Diese Antwortet dann dem Client indem sie sendto auf dem message-Socket aufruft.int retval = sendto(msgsock, Buffer, strlen(Buffer), 0, (struct sockaddr*) &from, fromlen);Der Client arbeitet folgendermaßen:
Er setzt einen einzigen Socket auf, auf dem er dann connect() aufruft zu dem Server.if ( ::connect(m_socket, (struct sockaddr*) &m_serveraddr, sizeof(m_serveraddr)) == SOCKET_ERROR)An einzelnen Stellen benötigt der Client dann Informationen vom Server.
Er ruft send() auf dem Socket auf, und direkt danach recv() und wertet die Antwort aus.retval = send(m_socket, sendbuf, strlen(sendbuf) + 1, 0); [...] retval = recv(m_socket, recvbuf, BUFSIZE, 0);Das Problem ist, dass der Client auf die Antwort vom Server angewiesen ist und erst weitermachen kann, wenn er diese bekommen hat.
Bisher funktioniert mein Konzept, aber nur in 95% der Faelle. Der Client schickt pro Sekunde eine ganze Menge Anfragen an den Server, und manchmal verschluckt er sich
(ein recv() oder ein send() scheitert, und daraufhin ist anscheinend der Socket tot und kann nicht mehr senden und empfangen?)
Ich frage mich jetzt wie ich darauf reagieren kann?
Die Seite, die zuerst einen Fehler bemerkt, muss der anderen Seite klarmachen, dass die Kommunikation wiederholt werden muss. Wie stelle ich das am besten an?
Gibt es bestimmte udp-client-server pattern?
Die Praemisse ist aber, dass ich nicht TCP Sockets benutzen kann.Hat jemand einen hilfreichen Vorschlag?
Cheers
Edit:
Oh, was ich vergessen habe, der Server muss auch bis zu 8 Clients bedienen koennen. Aber ich denke, das sollte kein Problem sein, wenn die Fehlerbehandlung geklaert ist. Jeder Client hat eine eigene Absenderadresse, womit ich nicht das Problem bekomme, mehrere Verbindungen von einem Client zu kriegen.
-
Der Client schickt pro Sekunde eine ganze Menge Anfragen an den Server, und manchmal verschluckt er sich

machst du das etwa damit socket revc beim Server nicht blockiert und du den nächsten Client empfangen kannst usw?
Falls ja, guck dir vielleicht mal das hier an: http://www.c-worker.ch/tuts/select.php