Socket Programmierung C / C ++ - recv Funktion hängt?

8

Meine recv-Funktion hängt, während die Antwort vom Server kommt.

Clientseitiger Code in c / c ++:

%Vor%

Mein Client ist C / C ++ und die Serverseite ist OpenEdge Progress. Bitte sehen Sie Code und schlagen Sie vor, was schief gelaufen ist. ??

    
Vishal 11.12.2009, 12:11
quelle

6 Antworten

8

Ihr Code blockiert den recv-Anruf, bis der Server Daten zurücksendet. Da dies nicht geschieht, sollten Sie sich vielleicht fragen, ob Ihr Kunde die vollständige Anfrage gesendet hat. Der Server wird wahrscheinlich nicht mit dem Senden der Antwort beginnen, bis die vollständige Anforderung empfangen wurde.

Wenn Ihr Client / Server-Protokoll textbasiert ist, wie HTTP oder SMTP, sind Sie sicher, dass Ihre Antwort korrekt beendet wurde? Der Server erwartet CR + LF ('\ r \ n') statt nur LF ('\ n') oder erwartet eine leere Zeile, um die Anfrage zu beenden:

%Vor%

PS. Sie deklarieren oder initialisieren in Ihrem Code-Snippet nicht "a".

    
notacat 11.12.2009 22:03
quelle
4

Ihr Code blockiert den recv-Anruf, bis der Server Daten zurücksendet. Da dies nicht geschieht, sollten Sie sich vielleicht fragen, ob Ihr Kunde die vollständige Anfrage gesendet hat. Der Server wird wahrscheinlich nicht mit dem Senden der Antwort beginnen, bis die vollständige Anforderung empfangen wurde.

Wenn Ihr Client / Server-Protokoll textbasiert ist, wie HTTP oder SMTP, sind Sie sicher, dass Ihre Antwort korrekt beendet wurde? Der Server erwartet CR + LF ('\ r \ n') statt nur LF ('\ n') oder erwartet eine leere Zeile, um die Anfrage zu beenden:

char * request="GET /index.html HTTP / 1.1 \ r \ nHost: www.beispiel.com \ r \ n \ r \ n"; PS. Sie deklarieren oder initialisieren "a" nicht in Ihrem Code-Snippet. "Von notacat

Ich habe an meiner Kopie der ersten Winsock-1.0- und 1.1-Implementierung in C ++ gearbeitet. Mein Code funktionierte den ganzen Weg zu recv () Anruf, und dann einfach dort hängen ... Ich wusste über das Blockieren \ Nicht blockierende Sockets, aber das war nicht die Lösung, die ich brauchte. Da ich meine Anfrage in Wireshark o.ä. sah, wusste ich, dass der Server meine Ende der String-Anfrage an Port 80 erhielt, und mein Code einfror auf recv () Anruf wegen Nicht-Kommunikation zwischen meinem Client und Server auf 'net. Was mich zu der Annahme verleitete, dass ich keine korrekte Anfrage eingereicht habe. Nun, der Autor (notaket) war vor Ort! Sobald ich zu seiner Anfrage gewechselt habe ("GET /index.html HTTP / 1.1 \ r \ nHost: www.example.com \ r \ n \ r \ n"), scheinen alle wie ein Zauber zu funktionieren! Danke !!

    
blackshark 21.03.2012 08:16
quelle
1

recv sollte hängen bleiben, bis Sie eine Antwort vom Server erhalten, haben Sie angegeben, dass die Antwort gesendet wird.
Versuchen Sie, wireshark oder etwas ähnliches, um das Netzwerk zu schnüffeln und zu sehen, ob die tatsächliche Antwort kommt oder nicht.

    
Arkaitz Jimenez 11.12.2009 12:15
quelle
1

Ähmm .... warum hast du die Steckdose abgeschaltet ....

%Vor%

Und doch hast du im Code fortgesetzt von demselben Socket zu empfangen, der heruntergefahren wurde ??

Hoffe, das deutet dich in die richtige Richtung, Freundliche Grüße, Tom.

    
t0mm13b 11.12.2009 12:42
quelle
1

Recv wird blockieren, bis der Socket Informationen zum Lesen hat, solange der Socket im Blockiermodus ist, Sie können dies mit fcntl ändern.

Wenn Sie sich fragen, warum es hängt, würde ich annehmen, dass wenn Sie die Schreib-Pipe auf dem Socket herunterfahren (auch wenn Sie die Konstante SHUT_WR als besseren Stil verwenden möchten), der Server einen EOF empfängt und Sie annimmt trennt die Verbindung, obwohl das möglicherweise nicht der Fall ist, wenn der Server dafür eingerichtet ist.

Ich würde vorschlagen, den Socket in den nicht blockierenden Modus zu versetzen und dann auszuwählen , was blockiert bis der Socket lesbar / schreibbar ist oder ein Timeout ausgelöst wird. Je nachdem, was Sie tun, wird das einen Unterschied machen.

    
Travis 11.12.2009 18:38
quelle
1

Versuchen Sie es mit dem Non-Blocking-Modus. d. h., recv kehrt zurück, wenn keine Daten zum Lesen vorhanden sind. Behandeln Sie diesen Fall (in einer while-Schleife oder mit select. Das liegt an Ihnen)

Weitere Informationen zu recv unter der Annahme, dass Sie sich auf einem POSIX-kompatiblen System befinden, lesen Sie dies Ссылка

    
ka05 11.12.2009 21:39
quelle

Tags und Links