Machen recvfrom () - Funktion, non-blocking
Arbeite ich an einem UDP-server/client-Anwendung.
Um herauszufinden, ob irgendwelche der client ausgefallen ist, sendet der server ein handshake-Nachricht an den client. Dann wartet der server auf die Antwort des client, um Daten zu senden, um sicherzustellen, dass der client aktiv ist. Für dieses blockiert der server in call to recvfrom()
es sei denn, der Kunde Antworten zurück, aber wenn der client heruntergefahren ist, blockiert der server stufenlos in call to recvfrom()
.
Ich soll die Implementierung einer solchen Funktionalität auf meinem server so, dass es wartet, in den Ruf zu recvfrom()
für eine bestimmte Zeit (sagen wir 2 Sek.). Wenn keine Daten vom client empfangen werden, innerhalb von 2 Sekunden der client ist als tot zu sein und recvfrom()
gibt.
Gibt es eine Möglichkeit, es zu tun? Ich durchsuchte das internet, fand aber Lösungen wie die Einstellung MSG_DONTWAIT
flag, das gibt sofort einen Wert zurück, wenn keine Daten empfangen wurden, aber in meinem Fall, will ich nicht recvfrom()
sofort wieder zurück, sondern warten Sie, bis die Daten für eine bestimmte Zeitdauer, und, wenn keine Daten empfangen, für eine bestimmte Dauer, die recvfrom()
Funktion zurückkehren sollte.
- Ok, Sie will die Implementierung zuverlässiger service. Sie können recvfrom () - Funktion im blockierenden Modus, mit fcntl() oder ioctl () - Funktion. Lesen Sie auch das UDP-zuverlässige Daten-service-Implementierung
- checkout c - Set timeout für winsock-recvfrom - Stack Overflow
- auch check out .es gibt Ihnen klare Erklärung in Sie wsarecv() (hat blockiert Regeln für die Funktion).
- Es ist ioctlsocket, für Windows. Etwas lahm und nicht Unix-like, aber sockets nicht behandelt wie normale Dateien...
- ok, ich habe nicht bemerkt
window
tag. Eh @ Ayesha muss Es einige ähnliche Weise in windows auch. Sorry das ich nicht helfen kann auf dieser mehr...viel Glück - Was ist mit
select()
nachdem Sie geschrieben auf dem client getestet werden.select()
nimmt optional eine time-out. - Danke an alle für all die hilfreichen Beiträge 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg wäre, um
setsockopt()
um einen receive time-out für die Buchse in Frage.SO_RCVTIMEO
verwendet.Wenn ein time-out festgelegt wurde, für einen socket übergeben
recvfrom()
gibt die Funktion nach dieser Zeit, wenn keine Daten empfangen worden war.Zum Beispiel, um eine 10 usec read time-out (add error-checking auf der returnvalue von
setsockopt()
wie nötig):Details unter Windows finden Sie hier, und unter Linux finden Sie hier und/oder hier (POSIX -).
select()
zu warten, für die Steckdose an, geben Sie einen lesbaren Zustand in einen timeout, DANN rufen Sierecvfrom()
nur wenn der socket ist eigentlich lesbar, der angibt, Daten zum Lesen verfügbar sind.select
. Sie bekommen viel besser kontrollieren, und es ist einfacher zu gehobenen zum Umgang mit Mehrfachsteckdosen.