0

嗨,我是套接字编程 C 的新手。现在我正在开发聊天程序,我可以成功发送和接收消息,但问题是当客户端请求发送该客户端在线的用户列表并且一旦服务器将消息发送回客户端,则消息成功打印当前连接的客户端列表,但一旦显示它就不会退出循环。下面只是代码的一部分。

服务器端(server.c)

pthread_mutex_lock(&list_mutex);
   for(i =0; i < NotEndOfList; i++)
   {

    sprintf(message_replay, "Server: %s \n", usersList[i].name); 
    write(sock , message_replay , strlen(message_replay));  

  }
  pthread_mutex_unlock(&list_mutex);

客户端(Client.c)

int i =0;
          while(i < NotEndOfList)
         {
            if( recv(sock , server_reply , 2000 , 0) < 0)
            {
              puts("recv failed");
              break;
            }
         i++;

        puts(server_reply);
      }

样本输出

    User A -->:
    //List 
    User A
    User B
    User C
    // Loop

正确的样本输出

User A -->:
//List
User A
User B
User C
User A -->:

非常感谢你

4

1 回答 1

0

如果所有消息的大小相同,则可以使用此解决方案。我不知道你的尺寸message_replay,让我们说它的类型char[256]

在服务器

而不是使用strlen()你总是可以发送 256 个字节。客户端将忽略空终止符之后的所有尾随字符。

write(sock , message_replay, 256); // or sizeof(message_replay) if it's static

在客户端

然后,客户端应该期望所有消息都是 256 字节长。一个循环一直运行,直到收到所有 256 个字符,并附加到receive_buffer[]每个循环。计数器跟踪我们收到了多少字节以及我们缺少多少。

for (int i = 0; i < NotEndOFList; i++) {
    char receive_buffer[256];
    int received_bytes = 0;
    int remaining_bytes = sizeof(receive_buffer);

    while (remaining_bytes > 0) {
        int res = recv(sock , &receive_buffer[received_bytes] , remaining_bytes, 0);
        if (res < 0) {
            puts("recv failed");
            break;
        }
        received_bytes += res;
        remaining_bytes -= res;
    }

    puts(receive_buffer);
}

PS!我没有测试过,如果你决定使用它,请告诉我它是如何运行的。

于 2013-10-17T16:15:13.797 回答