我遇到了一个谷歌搜索似乎无法解决的问题。为了简单起见,我有一个用 C# 编写的客户端和一个用 C 编写的运行 Linux 的服务器。客户端在循环中调用 Send(buffer) 100 次。问题是服务器只接收到十几个。如果我把一个足够大的睡眠放在一个循环中,一切都会好起来的。缓冲区很小 - 大约 30B。我读到了 Nagle 的算法和 ACK 延迟,但它没有回答我的问题。
for(int i = 0; i < 100; i++)
{
try
{
client.Send(oneBuffer, 0, oneBuffer.Length, SocketFlags.None)
}
catch (SocketException socE)
{
if ((socE.SocketErrorCode == SocketError.WouldBlock)
|| (socE.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
|| (socE.SocketErrorCode == SocketError.IOPending))
{
Console.WriteLine("Never happens :(");
}
}
Thread.Sleep(100); //problem solver but why??
}
在阻塞模式和非阻塞模式下,看起来发送缓冲区已满并拒绝数据,直到它再次变空。更好的是,我从来没有例外!?我希望会引发一些异常,但什么也不会。:(有什么想法吗?提前谢谢。