我又来了。。。Socket系统缓冲区不足或队列已满的问题
唉,最近用c# Socket写东西,碰到的问题太多了。。。
我在发送端发送一个比较大的内容(大概80M),接收端已经知道要接收内容的大小,因此用Receive函数循环接收直到所有数据接收完成:
int Offset = 0;
int Remain = PacketSize;
while (Remain > 0)
{
//int MinSize = Remain > 8192? 8192: Remain;
//int RealBytes = mClientSocket->Receive(mReceivePacketBuffer, Offset, MinSize , SocketFlags::None);
int RealBytes = mClientSocket->Receive(mReceivePacketBuffer, Offset, Remain, SocketFlags::None);
Offset += RealBytes;
Remain -= RealBytes;
Thread::Sleep(5);
}
如果循环中的Receive函数的Size参数尽量设置为最大,即将Size参数设置为没有接收完成的最大数量(程序中的 Remain),则在循环接收部分内容后就出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上操作 的问题;如果我在每次Receive后Sleep(5),则就不会出现这个问题了,将Sleep的值改小,则又可能出现,Sleep值越小越容易出现;为什么?
如果将Receive函数的Size参数设置为一个固定较小的值,例如跟接收缓冲区大小一样为8192(程序中的 MinSize),则不用Sleep也不会出现问题。但我不知道这样会不会使接收效率降低。