Note that there are some explanatory texts on larger screens.

plurals
  1. POSocket programming: recv/read issue
    primarykey
    data
    text
    <p><strong>EDIT:</strong> the code below has been fixed to receive and send properly AND to account for the actual bytes of messages sent annd recieved (latter thanks to EJP)</p> <p>I'm programming with C in Unix.</p> <p>I have server and client that are supposed to exchange msgs. While client seems to send messages fine, server doesn't receive the messages the client is sending. I've tried using <code>recv()</code> and <code>read()</code> (i know they are practically the same thing but with extra flags on <code>recv()</code>) but I have no luck and I'm not really sure what the problem really is. </p> <p>I put <code>sleep(3)</code> in the client code after every time it sends a message but i see that once client and server are connected, server immediately closes without waiting for the incoming messages. What am i doing wrong?</p> <p>This is the client-side code:</p> <pre><code>#define SERVER_TCP_PORT 11112 #define MAX_DATA_SIZE 500 int main(int argc, char * argv[]) { int sockfd; char * host; char msg[MAX_DATA_SIZE];/* = "get my msg!\n";*/ int msg_len; struct hostent * hp; struct sockaddr_in client_address, server_address; printf("y halo thar\n"); // looking up from the host database if (argc == 2) host = argv[1]; else exit(1); printf("sdf\n"); hp = gethostbyname(host); if (!hp) exit(1); printf("host found\n"); // setting up address and port structure information bzero((char * ) &amp;server_address, sizeof(server_address)); // copy zeroes into string server_address.sin_family = AF_INET; bcopy(hp-&gt;h_addr, (char *) &amp;server_address.sin_addr, hp-&gt;h_length); server_address.sin_port = htons(SERVER_TCP_PORT); printf("set\n"); // opening up socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0 ) exit(1); printf("opened\n"); // connecting if (connect(sockfd, (struct sockaddr *) &amp;server_address, sizeof(server_address)) &lt; 0) exit(1); printf("connected\n"); int i; for (i = 0; i &lt; MAX_DATA_SIZE; ++i) { msg[i] = '.'; } msg[MAX_DATA_SIZE-1] = '\0'; for(i = 0; i &lt; 11; i++) { // send message to connected socket msg_len = write(sockfd, msg, MAX_DATA_SIZE); if(msg_len &lt; 1) printf("notsent\n"); else printf("%i bytes sent\n", msg_len); // recieve messages from connected socket msg_len = read(sockfd, msg, MAX_DATA_SIZE); if (msg_len &lt; 1) printf("not recieved\n"); else { printf("%i bytes received\n", msg_len); printf(msg); printf("\n"); } } // close connection close(sockfd); printf("closed\n"); } </code></pre> <p>and this is the server side</p> <pre><code>#define SERVER_TCP_PORT 11112 #define MAX_DATA_SIZE 500 int main() { printf("o halo thar\n"); int sockfd, new_sockfd; int client_addr_len; char msg [MAX_DATA_SIZE]; int msg_len; char got_msg [11] = "got ur msg\0"; struct sockaddr_in server_address, client_address; // setting up address and port structure information bzero((char * ) &amp;server_address, sizeof(server_address)); // copy zeroes into string server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(SERVER_TCP_PORT); // opening up socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0 ) exit(1); printf("socket is opened\n"); // binding if (bind(sockfd, (struct sockaddr *) &amp;server_address, sizeof(server_address)) &lt; 0) exit(1); printf("socket is bound\n"); // listening listen(sockfd,5); printf("listening\n"); // block and wait for an incoming connection client_addr_len = sizeof(client_address); new_sockfd = accept(sockfd, (struct sockaddr *) &amp;client_address, &amp;client_addr_len); if (new_sockfd &lt; 0) exit(1); printf("accepted\n"); int i; for( i = 0; i &lt; 11; i++) { // recieve messages from connected socket printf("waiting\n"); msg_len = read(new_sockfd, msg, MAX_DATA_SIZE); if (msg_len &lt; 1) { printf("no msg recieved\n"); } else { printf("bytes recieved: %i\n", msg_len); } // send message to connected socket msg_len = write(new_sockfd, got_msg, sizeof(got_msg)); if (msg_len &lt; 1) printf("not sent\n"); else printf("%i bytes sent\n", msg_len); } // close connection close(sockfd); printf("socket closed. BYE! \n"); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload