嗨,我是新的套接字编程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 -->:
非常感谢
答案 0 :(得分:0)
如果所有消息的大小相同,则可以使用此解决方案。我不知道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!我没有测试过,如果您决定使用它,请告诉我它是如何运行的。