Socket Programmierung C/C++ - recv-Funktion hängt?
Mein recv-Funktion hängt, während die erste Antwort vom server.
Client-side code in c/c++:
void sockStuff() {
int sock, bytes_recieved,bytes_send;
char send_data[1024], recv_data[4096];
struct hostent *host;
struct sockaddr_in server_addr;
host = gethostbyname("127.0.0.1");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("SocketError");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(50500);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
bzero(&(server_addr.sin_zero), 8);
if (connect(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr))
== -1) {
perror("ConnectToError");
exit(1);
}
bytes_send = send(sock, a, strlen(a), 0);
bytes_send = shutdown(sock, 1);
bytes_recieved = recv(sock, recv_data, 4096, 0); //Where the program hangs??
recv_data[bytes_recieved] = '\0';
printf("\nRecieved data = %s ", recv_data);
cout << endl << endl;
shutdown(sock,2);
}
Mein Client ist C/C++ und server-Seite ist Progress OpenEdge.
Siehe code und vorschlagen, was ging falsch.??
- Sie sollten die Verwendung von sizeof(server_addr.sin_zero), anstatt die Magische Zahl 8. Oder noch besser null die gesamte Struktur und dann die Felder bestimmen, die Sie interessiert sind in.
- Hi Neil, können Sie bitte erläutern Sie diese mehr als ich versuchte, sizeof(server_addr.sin_zero), anstatt der Nummer 8, aber noch kein Glück.Thnx.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code-block in der recv-Aufruf, bis der server sendet keine Daten zurück. Da das nicht passiert, sollten Sie vielleicht Fragen Sie sich, wenn Ihr Kunde durch eine übermittlung der vollständigen Anfrage. Der server wird wahrscheinlich nicht starten Sie das senden der Antwort, bis der komplette request empfangen wurde.
Wenn Ihr client - /server-Protokoll ist text-basiert, wie HTTP oder SMTP, werden Sie sicher, dass Ihre Antwort ist korrekt terminiert? Der server kann damit rechnen, dass CR+LF ('\r\n') anstatt nur LF ('\n'), oder es erwartet Sie eine leere Zeile zum beenden der Anfrage:
PS. Sie nicht deklarieren oder initialisieren 'a' in deinem code-snippet.
Code-block in der recv-Aufruf, bis der server sendet keine Daten zurück. Da das nicht passiert, sollten Sie vielleicht Fragen Sie sich, wenn Ihr Kunde durch eine übermittlung der vollständigen Anfrage. Der server wird wahrscheinlich nicht starten Sie das senden der Antwort, bis der komplette request empfangen wurde.
Wenn Ihr client - /server-Protokoll ist text-basiert, wie HTTP oder SMTP, werden Sie sicher, dass Ihre Antwort ist korrekt terminiert? Der server kann damit rechnen, dass CR+LF ('\r\n') anstatt nur LF ('\n'), oder es erwartet Sie eine leere Zeile zum beenden der Anfrage:
char *request = "GET /index.html HTTP/1.1\r\nHost: http://www.example.com\r\n\r\n"; PS. Sie nicht deklarieren oder initialisieren " a " in Ihr code-snippet ein." durch notacat
Ich arbeiten war mein Exemplar am frühen winsock-1.0-und-1.1-Implementierung in c++ auf win.
Mein code war den ganzen Weg zu recv () - Aufruf, und dann gerade da hängen... ich kannte die Sperrung \Non-blocking sockets, aber das war nicht die Lösung, die ich benötigte. Da sah ich meine Anfrage in wireshark oder ähnliche ich wusste, dass server empfangen wurde, dass mein Ende von string-Anfrage auf port 80, und mein code einfrieren bis auf recv () - Aufruf durch nicht-Kommunikation zwischen meinem client und dem server auf der 'net. Das führte mich zu glauben, dass ich nicht ordnungsgemäßen Antrag Einreichen. gut, der Autor ( notaket ) war vor Ort auf!. Sobald ich geändert, um seine Anfrage( "GET /index.html HTTP/1.1\r\nHost: http://www.example.com\r\n\r\n") scheinen alle zu funktionieren wie ein Charme!. Danke!!
recv
hängen soll till u get response form der server -, haben Sie gesagt, dass die Antwort gesendet.Versuchen wireshark oder sowas zu schnüffeln das Netzwerk, und sehen Sie, wenn die eigentliche Antwort kommt, oder nicht.
Ähmm.... warum hast du das Herunterfahren der Steckdose....
Und trotzdem sind Sie weiter in den code zu erhalten, aus der gleichen Steckdose, die war Herunterfahren??
Hoffe, dass diese Hinweise Sie in die richtige Richtung,
Beste Grüße,
Tom.
Recv blockiert, bis der socket Informationen zu Lesen, solange der sockel ist im blockierenden Modus, können Sie das mit fcntl.
Wenn Sie sich Fragen, warum es hängen, meine Vermutung wäre, dass beim Herunterfahren die write-Leitung auf die Buchse (auch, möchten Sie vielleicht, um die Konstante SHUT_WR wie es ist besser Stil.) der server empfängt ein EOF und daß man sich trennen, obwohl das vielleicht nicht der Fall sein, wenn der server eingerichtet ist, zu behandeln.
Ich würde vorschlagen, Blick in die Einstellung der socket in den non-blocking Modus, dann ruft wählen Sie die gesperrt wird, bis der socket ist lesbar/schreibbar/oder ein timeout ausgelöst wird. Je nachdem, was Sie tun, wird einen Unterschied machen.
Versuchen mit dem Non-blocking-Modus. also recv zurück, wenn keine Daten da gelesen werden, also in diesem Fall behandeln (in einer while-Schleife oder mit auswählen. das ist bis zu Ihnen)
Mehr auf "recv" - Vorgang, vorausgesetzt, Sie sind auf einem POSIX-konformen system) Lesen Sie diese
http://www.opengroup.org/onlinepubs/009695399/functions/recv.html