Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c

sockets

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_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.??

like image 730
Vishal Avatar asked Dec 11 '09 12:12

Vishal


1 Answers

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!!

like image 128
blackshark Avatar answered Sep 20 '22 04:09

blackshark