开发者

Socket Programming C/C++ - recv function hangs?

开发者 https://www.devze.com 2022-12-14 06:02 出处:网络
My recv function hangs while getting reponse from server. Client side code in c/c++: void sockStuff() {

My recv function hangs while getting reponse from 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开发者_如何学JAVA_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);



}

My Client is C/C++ and server side is OpenEdge Progress. Please see code and suggest what went wrong with this.??


Your code will block in the recv call until the server sends any data back. Since that isn't happening, perhaps you should ask yourself if your client sent the complete request. The server will probably not start sending the response until the complete request is received.

If your client/server protocol is text based, like HTTP or SMTP, are you sure your response is correctly terminated? The server may be expecting CR+LF ('\r\n') instead of just LF ('\n') or it expects an empty line to terminate the request:

char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

PS. You don't declare or initialise 'a' in your code snippet.


Your code will block in the recv call until the server sends any data back. Since that isn't happening, perhaps you should ask yourself if your client sent the complete request. The server will probably not start sending the response until the complete request is received.

If your client/server protocol is text based, like HTTP or SMTP, are you sure your response is correctly terminated? The server may be expecting CR+LF ('\r\n') instead of just LF ('\n') or it expects an empty line to terminate the request:

char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n"; PS. You don't declare or initialise 'a' in your code snippet." by notacat

I was working on my copy on early winsock 1.0 and 1.1 implementation in c++ on win. My code worked all the way to recv() call, and then just hang there... I knew about blocking \Non blocking sockets, but that was not the solution I required. Since I saw my request in wireshark or similar I knew that server was receiving my end of string request on port 80, and my code freezing up on recv() call due to non communication between my client and server on 'net. Which led me to believe that I did not submit proper request. well, author ( notaket ) was on spot on!. As soon as I changed to his request( "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n") , all seem to work like a charm!. Thanks!!


recv should hang till u get response form the server, have you stated that the response is being send.
Try wireshark or something like that to sniff the network and see if the actual response is coming or not.


Recv will block until the socket has information to read as long as the socket is in blocking mode, you can change this with fcntl.

If you're wondering why it's hanging, my guess would be that when you shutdown the write pipe on the socket (also, you might want to use the constant SHUT_WR as it's better style) the server receives an EOF and assumes you're disconnecting, though that might not be the case if the server is setup to handle it.

I'd suggest looking into setting the socket into non-blocking mode, then calling select which will block until the socket is readable/writable/or a timeout is triggered. Depending on what you're doing, that will make a difference.


Try using the the Non blocking mode. i.e. recv will return if no data is there to be read, so handle this case (in a while loop or with select. that is up to you)

For more on recv, assuming you are on a POSIX compliant system) read this http://www.opengroup.org/onlinepubs/009695399/functions/recv.html


Ummm.... why did you shutdown the socket....

bytes_send = send(sock, a, strlen(a), 0);
    bytes_send = shutdown(sock, 1); /*** That I think is the problem! ***/


 bytes_recieved = recv(sock, recv_data, 4096, 0);

And yet you continued in the code to receive from the same socket that was shutdown??

Hope this hints you in the right direction.

0

精彩评论

暂无评论...
验证码 换一张
取 消