Wie man 'senden' non-blocking in winsock
Ich mache ein Programm, das sendet UDP-Pakete an einen server in einem festen Intervall, so etwas wie dieses:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
Jedoch die Periodizität nicht gewährleistet werden, da send
ist ein blockierender Aufruf (z.B., wenn fixedInterval
ist 20ms und ein Aufruf an send
ist > 20ms ). Wissen Sie, wie kann ich die send
in einer non-blocking-Betrieb?
- Wie beschreiben, hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der ioctlsocket API kann es tun.Sie können es verwenden, wie unten beschrieben.Aber warum nutzen Sie nicht die I/O-Modellen in winsock?
ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);
Müssen Sie mit einem nicht-blockierenden socket. Die send - /receive-Funktionen sind die gleichen Funktionen für blockierende oder nicht-blockierende Operationen, aber Sie müssen die Buchse sich nicht blockieren.
Beachten Sie auch, dass die Arbeit mit nicht-blockierenden sockets ist ganz anders. Sie benötigen um sicherzustellen, dass Sie Umgang mit WSAEWOULDBLOCK-Fehler als Erfolg! 🙂
So, mit non-blocking sockets kann helfen, aber noch keine Garantie für einen genauen Zeitraum. Sie wäre besser zu fahren, das von einem timer, anstatt diese einfache Schleife, so dass alle die Wartezeit vom Aufruf senden, auch im nicht-blockierenden Modus wird keinen Einfluss auf den Zeitpunkt.
fcntl()
undO_NONBLOCK
nicht vorhanden auf Windows. Das Windows-äquivalent vonO_NONBLOCK
zu ermöglichenFIONBIO
mitioctlsocket()
.Mein Gedächtnis ist unscharf hier, da es wohl schon 15 Jahre her, seit ich verwendet habe, UDP, non-blocking.
Allerdings gibt es einige Dinge, von denen Sie bewusst sein sollten.
Senden nur kleinere Pakete, wenn Sie über ein öffentliches Netzwerk. Die PFAD-MTU stolpern kann, wenn entweder der client oder der server ist nicht geschrieben, um aufzupassen, unvollständige Pakete.
Stellen Sie sicher, dass Sie überprüfen, die Sie gesendet haben, die Anzahl der bytes, die Sie denken, Sie haben zu senden. Es kann seltsam, wenn Sie erwarten sind, um zu sehen, 300 bytes gesendet und der Empfänger bekommt nur 248. Sowohl client-Seite und server-Seite müssen sich dieses Problems bewusst.
Sehen hier für einige gute Ratschläge von den Linux-Leute.
Sehen hier für die Unix-Socket-FAQ für UDP
Diese , ist eine gute Allgemeine Netzwerk-Programmierung-FAQ und Beispiel-Seite.
Wie etwa die Messung der Zeit Senden, zu sich nimmt und dann einfach nur schlafen die Zeit fehlt bis zu den 20ms?