In meinem Programm Wenn der Server nicht erreichbar ist, benötigt die Verbindungsfunktion zu viel Zeit. Also versuche ich Zeit zu geben, um mich mit select () zu verbinden. Jetzt ist das Problem, dass, wenn ich versuche, Daten vom Server zu empfangen, der recvfrom () verwendet, ich Fehler "EAGAIN" erhielt. Hier ist Code zum Verbinden und Empfangen von Daten vom Server.
%Vor%Einstellung der Zeit für die Funktion connect () tcp Socket Programmierung in C funktioniert nicht
Korrektur. Das Festlegen des Verbindungstimeouts funktioniert . Was 'nicht funktioniert' ist der folgende recvfrom()
, und zwar weil du den Socket im nicht-blockierenden Modus verlassen hast und du nicht weißt, was mit dem resultierenden EAGAIN.
zu tun ist. Also, handle das entweder mit select()
, um Ihnen mitzuteilen, wenn der Socket zum Lesen bereit ist, oder den Socket nach Abschluss der Verbindung wieder in den Blockiermodus zu versetzen.
Die erste erfolgreiche Auswahl bedeutet, dass die Verbindungsoperation abgeschlossen ist, aber nicht unbedingt bedeutet, dass sie erfolgreich ist , von connect man-Seite, sollten Sie SO_ERROR
überprüfen, um sicherzustellen, dass es erfolgreich abgeschlossen wurde
Es ist möglich, (2) oder poll (2) für die Beendigung auszuwählen, indem Sie die Option auswählen Steckdose zum Schreiben. Nach Auswahl von (2) Schreibbarkeit angeben, verwenden getsockopt (2), um die SO_ERROR-Option auf der Ebene SOL_SOCKET zu lesen Ermitteln, ob connect () erfolgreich ausgeführt wurde (SO_ERROR ist Null) oder nicht erfolgreich (SO_ERROR ist einer der üblichen Fehlercodes aufgelistet hier, erklären den Grund für den Fehler).
Also solltest du in deinem Code so etwas tun:
%Vor%Dann, wie in der anderen Antwort erwähnt, sollten Sie wählen Sie erneut vor dem Schreiben oder Lesen aus dem Sockel.
Sie erhalten EAGAIN
, weil keine Daten aus dem Socket-Puffer zu lesen sind und Ihr Socket auf nonblocking
gesetzt wurde. Da Sie nicht mit dem Peer verbunden sind, bin ich nicht überrascht.
Schau dir das von man recvfrom
:
Wenn keine Nachrichten am Socket verfügbar sind, warten die Empfangsaufrufe auf eine Nachricht, es sei denn, der Socket ist nicht blockierend (siehe fcntl (2)). In diesem Fall wird der Wert -1 zurückgegeben und die externe Variable errno gesetzt nach EAGAIN. Die Empfangsanrufe geben normalerweise alle verfügbaren Daten bis zum angeforderten Betrag zurück, anstatt auf den Erhalt des gesamten angeforderten Betrags zu warten.
Ein anderer Fall könnte der folgende sein:
readfrom
oder einfach read
) nur wenn du sicher bist, dass du etwas erhalten hast.