【发布时间】:2014-09-26 23:40:17
【问题描述】:
我的套接字有问题。我有一个服务器和一个客户端。
项目的目的:
客户端/服务器连接(都互相发送消息) 客户端发送消息; 服务器读取消息; 服务器将消息发回给客户端。
但我遇到了死锁,因为客户端和服务器都在等待接收消息。代码:
Server.c
message = "Client connection handler ok\n";
write(sock , message , strlen(message));
message = "type something and i'll repeat what you type \n";
write(sock , message , strlen(message));
//Receive a message from client
while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
{
puts(client_message);
//Send the message back to client
write(sock , client_message , strlen(client_message));
bzero(client_message,2000);
}
Client.c
//Here I print the two messages You can see server side code:
//- Client connection handler ok
//- type something and i'll repeat what you type
while( (read_size = recv(sockfd , client_message , 2000 , 0)) > 0 )
{
printf("%s\n",client_message);
bzero(client_message,2000);
}
在执行代码的过程中,我在客户端和服务器中都处于阻塞状态。
我该如何解决这个问题?
【问题讨论】:
-
客户端循环永远不会写入服务器,因此从您的代码中可以明显看出服务器将坐在那里等待。然后,如果它等待数据,它也永远不会写,所以客户端也会等待。
-
是的,但我不知道该如何解决...如果我在 while 中插入
fgets我会阻塞循环...这不好...你怎么看我从服务器向客户端发送两条消息...如果我将fgets放入其中,我只会收到第一个...所以我不知道如何解决这种情况... -
您可能想了解
select()和/或poll()。在 TCP 级别上也有 no 消息。 TCP 是面向流的。要进行消息传递,您需要在/使用双向 TCP 流之上定义和实现协议。 -
安全漏洞 - 即使您在每次调用 recv 之前将缓冲区归零,您的客户端和服务器代码都假设接收到的消息以空值结尾(最后一个字符为零字节)。我的恶意客户端(或服务器)可以向另一个节点发送一条 2000 字节的消息,最后没有空字符。简单的解决方法是将 1999 作为长度传递给 recv() ,然后在检查
read_size is >= 0后设置client_message[read_size] = '\0'