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