可以发送功能块

时间:2009-12-12 01:31:35

标签: linux sockets send epoll

我正在编写聊天程序,对于服务器,当我发送数据时send()函数需要很长时间才能发送数据吗?

这是我的问题: 我正在使用带有epoll的linux 2.6,单线程服务器 如果send()阻塞,则表示服务器上的所有其他活动都将停止。就像有一个非常慢的客户端长时间没有向tcp数据包发送ACK响应一样,send函数会立即继续运行,还是会等待很长时间才能运行客户端。我不想要的是一个/几个慢客户端导致聊天服务器延迟。

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

1 个答案:

答案 0 :(得分:3)

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

总的来说,我发现在非阻塞模式下同时执行send和recv,同时使程序复杂化,效果非常好。

使用类似:

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