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".
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 !!
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.
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.
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 Ссылка