我有一个客户端 .NET 应用程序和一个服务器 .NET 应用程序,它们通过套接字连接。
客户端每 500 毫秒发送一个大约 20 个字符的字符串。
在我的本地开发机器上,这完美地工作,但是一旦客户端和服务器位于两个不同的服务器上,服务器在发送时不会立即接收字符串。客户端仍然完美发送,我已经用 Wireshark 确认了这一点。我还确认服务器确实每 500 毫秒接收一次字符串。
问题是我正在等待消息的服务器应用程序实际上仅每 20 秒左右接收一次消息 - 然后它接收这 20 秒内的所有内容。
我使用异步套接字,出于某种原因,回调不会每 20 秒调用一次。
在 AcceptCallback
中建立连接并调用 BeginReceive
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
这在我的本地机器上有效,但在我的生产服务器上,ReadCallback 不会立即发生。
BufferSize 设置为 1024。我也尝试将其设置为 10。一旦调用 ReadCallback,它会影响一次从套接字读取的数据量,但这并不是真正的问题所在。一旦调用 ReadCallback,其余工作正常。
我正在使用 Microsoft Asynchronous Server Socket Example这样您就可以看到我的 ReadCallback 方法是什么样子的。
如何在数据到达服务器时立即获得 BeginReceive 回调?
--
更新
这已经解决了。这是因为服务器只有一个处理器和一个内核。再加一个核心后,问题瞬间解决。 ReadCallback 现在会在调用到达服务器时立即调用。
谢谢大家的建议!!
最佳答案
一种方法可能是调整发送端的 SO_SNDBUF 选项。由于当服务器/客户端都在同一个盒子上时您没有遇到此问题,因此可能由于服务器之间的(可能)较慢的发送速率,较小的缓冲区正在限制发送端。如果发送方发送速度不够快,则发送方缓冲区可能会更快填满。
更新:我们进行了一些调试,结果发现问题出在应用程序变慢了。
关于c# - 套接字缓冲它接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418613/