wie zu beheben WSAEWOULDBLOCK-Fehler
Ich habe eine win7-Anwendung, wo ich bin senden von Daten b\w 2-clients eine TCP-Verbindung. Beim testen fand ich heraus, dass ich immer WSAEWOULDBLOCK
Fehler Häufig auf meinen sockel. Zu
diesen Fehler beheben, ich habe eine while-Schleife um es für die ex.
do
{
size_t value = ::send(); /*with proper arguments*/
}while(GetLastError() == 10035);
So, wenn ich error 10035
werde ich die Daten erneut.
Aber jetzt sehe ich, dass diese while-Schleife läuft manchmal unendlich und meine Anwendung geht
in eine Art deadlock-Zustand. Ich habe versucht, die Erhöhung der Größe der Steckdose, aber noch nicht benutzt.
Wenn jemand hat eine Idee wie man beheben WSAEWOULDBLOCK
Fehler bitte lassen Sie es mich wissen.
size_t value = socket();
was ist es? Erhalten SieWSAEWOULDBLOCK
bei socket-Erstellung? Wenn nicht, verwenden Sie non-blocking-Modus (wenn ja, warum?)?- Sie brauchen keine Endlosschleife. Stattdessen können Sie möchten für sockel Ereignis und wenn der socket ist bereit zum senden, werden Sie benachrichtigt werden.
- meinst du
send()
stattsocket()
? (mit entsprechenden Parametern) - Warum sind Sie mit non-blocking-Modus, wenn Sie nicht wissen, wie? Würde ich nur verwenden, blocking-Modus, es sei denn, Sie wissen, Sie brauchen, non-blocking, in dem Fall sollten Sie unbedingt lernen, wie man mit select().
Du musst angemeldet sein, um einen Kommentar abzugeben.
WSAEWOULDBLOCK ist nicht wirklich ein Fehler, sondern einfach sagt Ihnen, dass Ihre sende-Puffer voll sind. Dies kann passieren, wenn Sie zu sättigen, das Netzwerk oder, wenn die andere Seite einfach nicht bestätigen der empfangenen Daten. Werfen Sie einen Blick auf die select () - Funktion, die ermöglicht es Ihnen, zu warten, bis pufferplatz verfügbar ist oder ein timeout Auftritt. Es gibt auch eine Möglichkeit zum binden einer win32-Ereignis zu einem stream, der dann seine Verwendung ermöglicht mit WaitForMultipleObjects, falls Sie Abbrechen möchten, warten früh.
BTW: ich wollte zunächst Einspruch gegen Ihre Verwendung des Begriffs "deadlock", aber das ist auch etwas, das passieren kann: Wenn Sie warten, um zu senden, die einige Antwort vor Eingang der nächsten Anfrage, und die andere Seite schicken will, eine nächste Anfrage statt Erhalt Ihrer Antwort, Ihre Anwendungen effektiv blockiert. Wählen Sie mit(), können Sie bestimmen, ob Sie Daten senden, Daten empfangen, oder, dass die Verbindung fehlgeschlagen ist, was können Sie auf diesen Fall korrekt und, wenn Sie auftreten.
Hinweis: ich auch davon ausgehen, dass Ihr code ist nicht wirklich ein Aufruf von socket (), aber ein senden/empfangen.