2009-12-12 37 views
0

我正在写一个聊天程序和服务器,当我发送数据可以send()函数需要很长时间发送数据?可以发送功能块

这是我的问题: 我使用linux 2.6与epoll,服务器在单线程 如果发送()块,那么这意味着服务器上的所有其他活动将停止。就好像如果有一个非常慢的客户端不会长时间向TCP数据包发送ACK响应,发送功能是否会马上移动,或者是否会等待客户端很长时间。我不想要的是一个/几个慢速客户端导致聊天服务器延迟。

我想要的是发送()到非阻塞,并很快返回。如果它没有发送所有的数据,它只会返回发送的数量,我会从缓冲区中删除它,并在下一次服务之前继续发送,直到发送所有数据。基本上我不希望发送阻塞在一个缓慢或无响应的客户很长一段时间。

回答

3

您可以将套接字设置为非阻塞模式,并且不会阻塞发送。问题在于,您必须管理发生部分写入的事实,并在写入文件描述符再次变为活动状态时发送其余数据。

一般来说,我发现在非阻塞模式下同时执行send和recv,虽然使程序复杂化,但工作得很好。

使用类似:

if (-1 == (flags = fcntl(fd, F_GETFL, 0))) 
     flags = 0; 
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);