【问题标题】:can the send function block可以发送功能块吗
【发布时间】:2010-12-25 21:38:03
【问题描述】:

我正在编写一个聊天程序,对于服务器,当我发送数据时,send() 函数会花费很长时间来发送数据吗?

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

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

【问题讨论】:

    标签: linux sockets send epoll


    【解决方案1】:

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

    总的来说,我发现在非阻塞模式下同时执行发送和接收,虽然使程序复杂化,但效果很好。

    使用类似的东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      相关资源
      最近更新 更多