【发布时间】:2013-10-16 20:54:40
【问题描述】:
我遇到了一个谷歌搜索似乎无法解决的问题。为了简单起见,我有一个用 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??
}
在阻塞模式和非阻塞模式下,看起来发送缓冲区已满并拒绝数据,直到它再次变空。更好的是,我从来没有例外!?我希望会引发一些异常,但什么也不会。 :( 有什么想法吗?谢谢。
【问题讨论】:
-
我会先分析 TCP 流量(在 Windows PC 上使用 WireShark,在 Linux 服务器上使用 tcpdump!)。
-
发生了哪些其他 SocketExceptions?你正在吞咽一些。你如何关闭套接字?使用关机(发送)。显示 Linux 服务器代码。
-
您在服务器端究竟收到了什么?收到的十几个数据包是否包含全部数据?
-
让我猜猜:你假设 recv 一次会读取整个“消息”或一个“缓冲区”?
-
@kol 我肯定会这样做