服务器代码如下,当客户端连接上时。客户端每发一条消息服务器就会正确输出一条对应,但是当我关闭掉客户端后,服务器竟然无限制重复输出最后一条消息,recv用不阻塞并且总能拿到最后一条消息,为啥啊?
ret = listenSocket(sockfd);
if (ret < 0)
{
return ;
}
int clientfd = acceptSocket(sockfd);
if (clientfd < 0)
{
return ;
}
while(1){
char buf[1024] ;
recv(clientfd,buf,1024,NULL);
cout << buf<
当客户端断开连接时,服务器的 recv 函数会返回零,这意味着对端已关闭连接。但是在上面的代码中,您没有检查 recv 函数的返回值,因此当客户端断开连接时,服务器会一直重复输出最后一条消息。
要解决这个问题,您需要在 recv 函数中检查返回值,当 recv 返回零时退出循环,这样就能在客户端断开连接时正确退出循环,结束服务器对该客户端的监听。
int ret = recv(clientfd,buf, 1024, NULL);
if(ret <=0)
break;
cout << buf << endl;
当返回值小于0,是客户端和服务端断开了连接,代码如下【注意:不能含等于 0】:
int clientfd = acceptSocket(sockfd);
if (clientfd < 0)
{
return ;
}
while(1){
char buf[1024] ;
int ret = recv(clientfd,buf,1024,NULL);
if(ret <0) {
printf("Server receive failed!\r\n");
return NULL;
}
cout << buf<<endl;