C套接字:为什么我的服务器最后附加额外的字符?

时间:2017-08-30 00:36:46

标签: c sockets tcp client-server

我在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

3 个答案:

答案 0 :(得分:1)

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

中的字符串只是一系列可打印字符后跟'\0',并且您的数组都没有'\0',因此strlen()导致未定义的行为。 strlen()函数实际扫描字符串,直到找到'\0',并在此过程中计算出有多少个字符。

答案 1 :(得分:0)

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

write(client_socket_fd, buffer, strlen(buffer))

为:

write(client_socket_fd, buffer, read_size)

答案 2 :(得分:-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)) {