【问题标题】:Winsock: Can i call send function at the same time for different socket?Winsock:我可以同时为不同的套接字调用发送函数吗?
【发布时间】:2013-01-20 22:19:59
【问题描述】:

比方说,我有一个服务器,有许多通过 TCP 连接的客户端,每个客户端都有一个套接字,每个客户端都有一个发送和接收线程。是否安全且可以同时调用发送函数,因为它不会为同一个套接字调用发送函数。

如果安全且没问题,我可以同时将数据流式传输到客户端而不阻塞其他客户端的发送功能吗?

非常感谢您的回答。

【问题讨论】:

    标签: sockets winsock


    【解决方案1】:

    是的,它是可能的并且是线程安全的。您可以对其进行测试,或者自己解决如果不是这样,IS、IIS、SQL Server 等将无法正常工作。

    【讨论】:

    • 谢谢。你知道,问比自己尝试结果更容易。我的最后一句话呢?一个发送时会阻塞其他发送功能吗? :)
    • 当然——仅仅因为一个线程在发送时被阻塞,因为它的“写缓冲区”已满,(比如客户端宕机),并不能阻止其他线程正常通信。
    【解决方案2】:

    假设这是来自“Winsock”标签的 Windows。

    总体而言,这种设计(每个连接的客户端都有一个发送/接收线程)不会扩展。希望您意识到这一点,并且您知道您的客户端数量非常有限(即使那样,我也不会这样写)。

    您不需要为每个客户端都有一个线程对。

    您可以使用非阻塞 IO 和读/写就绪通知(使用 select() 或重叠 IO 的一种,例如完成例程或完成端口)为大量客户端提供服务。如果您使用完成端口,您可以设置一个线程池来处理套接字 IO 并将工作排队为您自己的工作线程或线程/线程池。

    是的,您可以同时从不同的线程发送和接收多个套接字;但是您不应该需要那些额外的线程,因为您根本不应该对 send/recv 进行阻塞调用。当您进行非阻塞调用时,可以立即写入的数量被写入并且函数返回,然后您会注意发送了多少,并在套接字下一次可写时请求通知。

    我认为您可能需要考虑一种不同的方法,因为这不是简单的事情;如果您使用.Net,您可能会通过使用 TcpListener 或 HttpListener 构建它(两者都为您使用完成端口),但请注意,您无法轻松禁用 Nagle 算法,因此如果您需要交互性(想想Google 搜索页面上的自动完成功能),那么您可能无法获得您想要的性能。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 2017-10-25
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多