【问题标题】:C sockets: why is my server appending extra characters in the end?C 套接字:为什么我的服务器最后会附加额外的字符?
【发布时间】:2018-02-07 13:33:58
【问题描述】:

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

【问题讨论】:

    标签: c sockets tcp client-server


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。另外你能解释一下当输入像“你好吗”这样的消息时,服务器会在不同的行中响应。“How”、“are”和“you”在三个不同的行中
    • 因为它是这样工作的。您需要 1. 使用select 并阅读,直到没有更多内容可阅读,但这很棘手。 2. 使用消息传递协议组装消息并在到达对方时对其进行重构。
    【解决方案2】:

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

    write(client_socket_fd, buffer, strlen(buffer))
    

    到:

    write(client_socket_fd, buffer, read_size)
    

    【讨论】:

      【解决方案3】:

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

      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)) {
      

      【讨论】:

      • 谢谢。我是新手,这有帮助。但是,当我输入“你好吗”之类的字符串时,它会显示在不同的行上。
      • 可能scanf() 在空格处进行标记。这与您提出的问题无关。
      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2019-04-15
      • 2016-11-08
      • 2021-04-30
      相关资源
      最近更新 更多