为什么TCP Socket.Receive不阻塞,直接返回0字节
使用.NET 4.5 WIN7系统很奇怪,在调试的时候发现一个接收数据的线程里面Receive 一直返回0字节造成100%CPU占用率
代码片段:
public void Receive()
{
byte[] recByteBuffer = new byte[1024];
int sindex = 0,nindex = 0;
int rdLength = 0;
uint dataLength = 0;
//socket.ReceiveTimeout = 5000;
while(true)
{
try
{
rdLength = socket.Receive(recByteBuffer);
if (rdLength == 0)
{
//if (stRemote.Connected == false)
// break; //没有接收到数据
//else
Thread.Sleep(5);
continue;
}
直接返回0,不是应该没数据0字节不返回阻塞的嘛?
--------------------编程问答-------------------- 把阻塞放在if外面 --------------------编程问答--------------------
我的意思是,为什么Receive本身不阻塞,直接返回0个字节,应该没有数据的话是不会返回的,也就是
rdLength = socket.Receive(recByteBuffer);
if (rdLength == 0)
这个IF 应该一直不会执行的 --------------------编程问答-------------------- 增加一付截图,前面那图截的时候我把网线拔了,显示Connected为false,重新接了下,连接都在,但就是立刻返回,不知道为什么 --------------------编程问答-------------------- 想要阻塞就用异步接收
--------------------编程问答--------------------
//主调方法:
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecCallback), null);
//回调方法:
private void RecCallback(IAsyncResult ar)
{
int received = socket.EndReceive(ar); //在这里阻塞
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecCallback), null);
}
异步一样有这问题。 --------------------编程问答-------------------- 今天发现了这句。
如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。
http://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx
--------------------编程问答-------------------- 网线拔掉了,当然连接重置了。堵塞发生在receive那里,sleep那里是无意义的。
补充:.NET技术 , C#