我可以在服务器循环中使用阻塞TCP Socket.Send吗?

时间:2014-02-10 18:54:37

标签: c# sockets networking tcp

如果其中一个套接字阻止Send(),它可能会影响其他客户端。我很担心:Send()是否等待“交付”答案?如果它不是远程客户端可以通过忽略传入的数据包来阻止我的服务器事件处理循环 - 那么我应该使用BeginSend。但我已经测量过BeginSend吃了更多的CPU。所以我想知道天气是否可以在服务器事件循环中使用阻塞发送?

正如MSDN所述

  

成功完成发送并不表示数据已成功发送。

我知道套接字在发送缓冲区被填满时也会阻塞。

1 个答案:

答案 0 :(得分:1)

  

如果其中一个套接字阻止Send(),它可能会影响其他客户端。

仅当您的服务器是单线程时。解决方案:多线程。

  

我很担心:Send()是否等待"已交付"回答?

不,但是如果客户端没有读取并且缓冲区已满,则可以阻止。

  

如果远程客户端可以通过忽略传入的数据包来阻止我的服务器事件处理循环 - 那么我应该使用BeginSend。但我已经测量过BeginSend吃了更多的CPU。所以我想知道天气在服务器事件循环中使用阻塞发送是否可以接受?

不,不是。如果您能克服厌恶,请使用多线程,非阻塞I / O或异步I / O.你对3-4%开销的建议对我来说听起来不对。