当前位置:编程学习 > C#/ASP.NET >>

为什么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外面  --------------------编程问答--------------------
引用 1 楼 libinguest 的回复:
把阻塞放在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);
}
--------------------编程问答--------------------
引用 4 楼 sunny906 的回复:
想要阻塞就用异步接收
C# code?12345678910//主调方法:socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecCallback), null); //回调方法:private void RecCallback(IAsyncResult a……


异步一样有这问题。 --------------------编程问答-------------------- 今天发现了这句。

如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。


http://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx

--------------------编程问答-------------------- 网线拔掉了,当然连接重置了。堵塞发生在receive那里,sleep那里是无意义的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,