0

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

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

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

4

1 回答 1

3

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

一般来说,我发现在非阻塞模式下发送和接收,虽然使程序复杂化,但效果很好。

使用类似的东西:

    if (-1 == (flags = fcntl(fd, F_GETFL, 0)))
        flags = 0;
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
于 2009-12-12T01:42:09.697 回答