Note that there are some explanatory texts on larger screens.

plurals
  1. POc socket programming, Error in receiving a line
    primarykey
    data
    text
    <p>I have modified a code of simple chat program using Socket programming in C.My problem is that i have to enter two lines at either server or client to receive only one line by the other.I have uploaded an image to explain more. Any help is appreciated </p> <pre><code>SERVER #include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include&lt;sys/socket.h&gt; #include&lt;netinet/in.h&gt; #include&lt;stdlib.h&gt; #include&lt;strings.h&gt; #include&lt;unistd.h&gt; #define SERVER_TCP_PORT 3000 #define BUFLEN 256 int main (int argc,char **argv) { int n,bytes_to_read; int sd,new_sd,client_len,port; struct sockaddr_in server,client; char *bp,buf[BUFLEN]; switch (argc) { case 1: port = SERVER_TCP_PORT; break; case 2: port = atoi (argv[1]); break; default: fprintf (stderr,"Usage: %s[port]\n",argv[0]); exit(1); } /*Create a system socket */ if ((sd = socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"Can't create a socket\n"); exit(1); } /*Bind an address to the socket*/ bzero ((char*)&amp;server,sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sd,(struct sockaddr *)&amp;server,sizeof(server))==-1){ fprintf(stderr,"can't bind name to socket\n"); exit(1); } /*queue up to 5 connect requests*/ listen(sd,5); while(1){ client_len = sizeof(client); if((new_sd = accept(sd,(struct sockaddr *)&amp;client,&amp;client_len))==-1){ fprintf(stderr,"can't accept client \n"); exit(1); } if(fork()) { printf("\n Server listening to clients on port 2000"); printf("\n Server got request from%s",inet_ntoa(client.sin_addr)); printf("\n SEND DATA&lt;q or Q to quit&gt; :%s",buf); scanf("%s",buf); while((strcmp(buf,"q")!=0)&amp;&amp;(strcmp(buf,"Q")!=0)) { send(new_sd,buf,30,0); scanf("%s",buf); } send(new_sd,"q",5,0); } else{ n = recv(new_sd,buf,30,0); while((strcmp(buf,"q")!=0)&amp;&amp;(strcmp(buf,"Q")!=0)) { printf("\nRECEIVED DATA =%s",buf); n = recv(new_sd,buf,30,0); } printf("\n Bye"); send(new_sd,"EOF",4,0); close(sd); close(new_sd); } } return 0; } Client #include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include&lt;sys/socket.h&gt; #include &lt;netdb.h&gt; #include&lt;stdlib.h&gt; #include&lt;strings.h&gt; #include &lt;netinet/in.h&gt; #define SERVER_TCP_PORT 3000 #define BUFLEN 256 int main(int argc,char **argv) { int n,bytes_to_read; int sd,port; struct hostent *hp; struct sockaddr_in server; char *host,*bp,rbuf[BUFLEN],sbuf[BUFLEN]; switch(argc) { case 2: host = argv[1]; port = SERVER_TCP_PORT; break; case 3: host = argv[1]; port = atoi(argv[2]); break; default: fprintf(stderr,"Usage: %s host[port] \n",argv[0]); exit(1); } /*Create a stream socket*/ if ((sd=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"Can't create a socket\n"); exit(1); } bzero ((char *)&amp;server,sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(port); if((hp = gethostbyname(host))==NULL){ fprintf (stderr,"Can't get server's address\n"); exit(1); } bcopy(hp-&gt;h_addr,(char *)&amp;server.sin_addr,hp-&gt;h_length); /*connecting to the server*/ if (connect (sd,(struct sockaddr *)&amp;server,sizeof(server))==-1){ fprintf(stderr,"Can't connect \n"); exit(1); } printf("Connected:server's address is %s\n",hp-&gt;h_name); if(fork()) { bzero(rbuf,30); printf("\n SEND DATA&lt;q or Q to quit&gt; :%s",rbuf); scanf("%s",rbuf); while((strcmp(rbuf,"q")!=0)&amp;&amp;(strcmp(rbuf,"Q")!=0)) { send(sd,rbuf,30,0); scanf("%s",rbuf); } send(sd,"q",5,0); } else{ n = recv(sd,rbuf,30,0); while((strcmp(rbuf,"q")!=0)&amp;&amp;(strcmp(rbuf,"Q")!=0)) { printf("\nRECEIVED DATA =%s",rbuf); n = recv(sd,rbuf,30,0); } printf("\n Bye"); send(sd,"EOF",4,0); close(sd); } return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    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