c - 接收多条消息的socket编程C

标签 c sockets network-programming

嗨,我是套接字编程 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 -->:

非常感谢

最佳答案

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

在服务器

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

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!我还没有测试过,如果您决定使用它,请告诉我它是如何运行的。

关于c - 接收多条消息的socket编程C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19431199/

相关文章:

c - 如何在多线程 TCP 服务器中获取每个连接的客户端地址

sockets - Solaris - 我的进程监听所有接口(interface),但其他进程监听本地主机 :6011

c - 如何将命令行参数传递给线程函数

c - 从 C 中的文件运行 bash 脚本

python - 服务器/客户端应用程序和 JSONDecodeError : Unterminated string python

c - C语言多客户端服务器通信程序如何同时使用writefds和readfds?

c - 从字符串中删除括号中的文本?

c - struct c 动态分配内存

c - 将数据报发送到无法到达的目的地时,sendto() 对于 IPv4 和 IPv6 有不同的行为

c - 从 STDIN 读取用户输入时出现段错误