2017-08-30 85 views
1

我正在用C编写一个简单的服务器/客户端套接字。客户端要求用户输入一条消息,服务器通过重复相同的方式做出响应。问题是,当我从客户端发送消息时,服务器通过附加额外字符来回应。我该如何解决。C套接字:为什么我的服务器最后会附加额外的字符?

这是我的客户端代码

while(1) { 
    bzero(buffer, BUFSIZE); 
    printf("Enter Message: "); 
    scanf("%s", buffer); 
    //send some data 
    if(send(socket_fd, buffer, strlen(buffer), 0) <0) { 
     fprintf(stderr,"sending failed\n"); 
     return 1; 
    } 
//receive a reply from the server 
if(recv(socket_fd, server_reply, BUFSIZE,0)<0) 
{ 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
fprintf(stdout, "Reply: %s\n ", servreply); 

} 

这是我的服务器代码

int read_size; 
    while((read_size = recv(client_socket_fd, buffer, BUFSIZE,0))>0) 
    { 

     // Reply back to the client 
     if (0 > write(client_socket_fd, buffer, strlen(buffer))) { 
      fprintf(stderr, "could not write back to socket\n"); 
     } else { 
      fprintf(stdout, "message back to client\n"); 
     } 
    } 
    if(read_size==0) 
    { 
     fprintf(stderr,"disconnected.\n"); 
     fflush(stdout); 
    } 
    else if(read_size==-1){ 
     fprintf(stderr, "error.\n"); 
    } 

这是输出

Enter Message: welcome 
Reply: welcome 
Enter Message: hello 
Reply: hellome 
Enter Message: hi 
Reply: hillome 

回答

1

您才能使用strlen()需要 。你的数组不是字符串,而是依赖于read_size而不是缓冲区的长度。

字符串中仅仅是可打印字符,随后是'\0'序列,并没有你的阵列有任何'\0'所以strlen()导致不确定的行为。 strlen()函数实际上扫描字符串,直到它找到'\0'并且在此过程中它计数了那里有多少个字符。

+0

谢谢。另外,当你输入“你好吗”这样的信息时,你可以解释一下,服务器响应不同的线路。“如何”“是”和“你”分别位于三条不同的线路上 –

+0

因为这就是它的工作原理。你需要1.使用'select'并阅读,直到没有其他东西可读,但这是棘手的。 2.使用消息传递协议来汇编消息,并在消息到达另一方时进行重构。 –

0

@ Iharob的回答是正确的。基本上,改线:

write(client_socket_fd, buffer, strlen(buffer)) 

到:

write(client_socket_fd, buffer, read_size) 
-1

它不是。您在缓冲区的末尾打印垃圾。你也忽略了流的结束。

if(recv(socket_fd, server_reply, BUFSIZE,0)<0) { 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
fprintf(stdout, "Reply: %s\n ", servreply); 

应该

int count; 
if((count = recv(socket_fd, server_reply, BUFSIZE,0))<0) { 
    fprintf(stderr,"failed to reply. \n"); 
    break; 
} 
else if (count == 0) { 
    // EOS 
    fprintf(stderr, "peer has disconnected.\n"); 
    break; 
} else { 
    fprintf(stdout, "Reply: %.*s\n ", count, servreply); 
} 

你 '写回客户端' 也是不正确的:

if (0 > write(client_socket_fd, buffer, strlen(buffer))) { 

应该

if (0 > write(client_socket_fd, buffer, read_size)) { 
+0

谢谢。我对此很陌生,这有所帮助。但是,当我输入“你好吗”这样的字符串时,它会在不同的行上显示它。 –

+0

可能'scanf()'在空格处标记化。它与你问的问题无关。 – EJP

相关问题