c# - 套接字缓冲它接收到的数据

标签 c# sockets

我有一个客户端 .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/

相关文章:

c# - 是什么将 IsFaulted 设置为 false?

c# - imageresizer.net性能基准

java - 寻找并证明最佳的端口/ socket /线程比

c++ - 多连接套接字c++

c# - 如何在Raspberry PI上运行.net core 3.1应用程序?

c# - 通过 ReceiveAsync 进行的 Azure 队列处理立即返回 null

c# - 使用异步时未处理 SqlConnection

从套接字读取/解密时出现 java.io.EOFException

sockets - 通过 TCP 发送时的数据结构填充

linux - 如何释放socket?