为什么TCP Socket.Receive不阻塞,直接返回0字节

ckl881003 2012-12-07 04:27:34
使用.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字节不返回阻塞的嘛?
...全文
1175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujiechang 2013-04-09
  • 打赏
  • 举报
回复
网线拔掉了,当然连接重置了。堵塞发生在receive那里,sleep那里是无意义的。
xxgclj 2013-04-09
  • 打赏
  • 举报
回复
今天发现了这句。 如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。 http://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx
xxgclj 2013-04-09
  • 打赏
  • 举报
回复
引用 4 楼 sunny906 的回复:
想要阻塞就用异步接收 C# code?12345678910//主调方法:socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecCallback), null); //回调方法:private void RecCallback(IAsyncResult a……
异步一样有这问题。
sunny906 2012-12-07
  • 打赏
  • 举报
回复
想要阻塞就用异步接收

//主调方法:
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);
}
ckl881003 2012-12-07
  • 打赏
  • 举报
回复
增加一付截图,前面那图截的时候我把网线拔了,显示Connected为false,重新接了下,连接都在,但就是立刻返回,不知道为什么
ckl881003 2012-12-07
  • 打赏
  • 举报
回复
引用 1 楼 libinguest 的回复:
把阻塞放在if外面
我的意思是,为什么Receive本身不阻塞,直接返回0个字节,应该没有数据的话是不会返回的,也就是 rdLength = socket.Receive(recByteBuffer); if (rdLength == 0) 这个IF 应该一直不会执行的
风之影子 2012-12-07
  • 打赏
  • 举报
回复
把阻塞放在if外面

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧