我正在写一个聊天程序,对于服务器,当我发送数据时,send()函数能花很长时间发送数据吗?
这是我的问题:
我使用的是带有epoll的linux 2.6,单线程服务器
如果send()阻塞,则意味着服务器上的所有其他活动都将停止。例如,如果有一个非常慢的客户端在很长一段时间内没有向tcp包发送ACK响应,那么send函数是否会立即继续运行,或者是否会等待客户端很长时间。我不想让一个或几个速度慢的客户端造成聊天服务器的延迟。
我想要的是send()到nonblock并很快返回。如果它没有发送所有的数据,它只会返回发送的数据量,我会从缓冲区中删除它,并在下次发送服务时继续发送,直到发送所有的数据。基本上,我不想在一个缓慢或无响应的客户端上长时间发送到块。
最佳答案
您可以将套接字设置为非阻塞模式,发送不会阻塞。问题是,您必须管理发生部分写入的事实,并在写入文件描述符再次变为活动时发送其余数据。
一般来说,我发现在非阻塞模式下同时执行send和recv,虽然会使程序复杂化,但效果非常好。
使用类似于:
if (-1 == (flags = fcntl(fd, F_GETFL, 0)))
flags = 0;
return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
关于linux - 可以发送功能块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1891897/