Ich arbeite an einer UDP-Server/Client-Anwendung.
Um herauszufinden, ob einer der Clients ausgefallen ist, sendet der Server eine Handshake-Nachricht an den Client. Dann wartet der Server auf die Antwort des Clients, um einige Daten zu senden, um sicherzustellen, dass der Client aktiv ist. Dazu blockiert der Server den Anruf recvfrom()
es sei denn, der Client antwortet zurück, aber wenn der Client ausgefallen ist, blockiert der Server unendlich viele Anrufe recvfrom()
.
Ich möchte eine solche Funktionalität auf meinem Server implementieren, damit er auf den Aufruf wartet recvfrom()
für eine bestimmte Zeit (z. B. 2 Sekunden). Wenn innerhalb von 2 Sekunden keine Daten vom Client empfangen wurden, gilt der Client als tot und recvfrom()
kehrt zurück.
Gibt es eine Möglichkeit, dies zu tun? Ich habe im Internet gesucht, aber Lösungen wie Einstellungen gefunden MSG_DONTWAIT
Flag, das sofort zurückkehrt, wenn keine Daten empfangen werden, aber in meinem Fall möchte ich nicht recvfrom()
sofort zurückzukehren, aber für eine bestimmte Zeitdauer auf Daten zu warten, und wenn für diese bestimmte Zeitdauer keine Daten empfangen werden, die recvfrom()
Funktion sollte zurückkehren.
Ok, Sie möchten einen zuverlässigen Dienst implementieren. kannst du einstellen recvfrom()-Funktion im Sperrmodus mit fcntl()- oder ioctl()-Funktion. Lesen Sie auch diese Implementierung des zuverlässigen UDP-Datendienstes
– Grijesh Chauhan
11. April 2013 um 5:46 Uhr
Kasse c – Timeout für winsock recvfrom festlegen – Stack Overflow
– Koushik Shetty
11. April 2013 um 5:49 Uhr
Auch Kasse .es gibt Ihnen eine klare Erklärung in WSARecv() (hat Sperrregeln für die Funktion).
– Koushik Shetty
11. April 2013 um 5:52 Uhr
@GrijeshChauhan Es ist ioctlsocket für Windows. Etwas lahm und nicht-Unix-artig, aber Sockets werden nicht als normale Dateien behandelt …
– autistisch
11. April 2013 um 5:57 Uhr
Was ist mit der Verwendung
select()
nachdem Sie den zu testenden Kunden angeschrieben haben.select()
übernimmt eine optionale Auszeit.– alk
11. April 2013 um 6:17 Uhr