Zeitüberschreitung für die Funktion connect () tcp socket Programmierung in C bricht auf recv ()

7

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%     
Rajesh 10.01.2013, 08:59
quelle

4 Antworten

6
  

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.

    
EJP 10.01.2013, 22:21
quelle
5

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.

    
iabdalkader 10.01.2013 10:11
quelle
5

Der Socket sollte vor dem Aufruf von recv () erneut in den Blockiermodus versetzt werden.

%Vor%     
jungwook 19.08.2013 05:45
quelle
4

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 :

an
  

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:

  • Ihr Socket ist möglicherweise verbunden, aber Sie überprüfen zu schnell, ob etwas empfangen wurde. Um dies zu vermeiden, legen Sie vor dem recvfrom eine weitere Auswahl fest, um das Paket aus dem Socket-Puffer zu extrahieren (Aufruf von readfrom oder einfach read ) nur wenn du sicher bist, dass du etwas erhalten hast.
Davide Berra 10.01.2013 09:18
quelle

Tags und Links