本帖最后由 xiaoa_m 于 2010-05-30 11:21:51 编辑

解决方案 »

  1.   

    很明显你的逻辑有严重的问题嘛
    你count如果等于1就一直等于1你循环里并没有对count进行过处理。
    当然是死循环。 while (count>0)
                {
                    Count = ClientSocket.Receive(buffer, buffer.Length, 0);
                    RecString = RecString + Encoding.ASCII.GetString(buffer, 0, Count);
                    count--;//循环一次减少一次。
                } 
      

  2.   

    将SOCKET接受数据开一个线程,就是用thread,与主线程分开,就不会卡死了
      

  3.   

    count一直大于0,  调试的时候可以看下了。
      

  4.   

    将SOCKET接受数据开一个线程,就是用thread,与主线程分开,就不会卡死了 
    ren都告诉你了,还找啥高人。如果Count大于1死循环呀。程序肯定当了
      

  5.   

    socket通信里面 应该用异步的
    因为不清楚什么时候 会返回 
    所以不能用阻塞
      

  6.   

    什么乱七八糟的?!我来给楼上各位解释一个#1楼的意思:假设 buffer.Length 等于4096,并且假设socket缓冲区中有9000个字节数据,那么第一次,count等于4096,填满了缓冲区,于是再次执行while(count>0)开始循环,这时又读出了4096个字节,count再次等于4096,于是又再次执行while(count>0)开始循环,这时缓冲区中只有808个字节读入buffer,count这次赋值为800,于是又再次执行while(count>0)开始循环,可是这是缓冲区中没有数据,ClientSocket.Receive这条语句“死在这里”等着有数据填入缓冲区.......就是这么一回事!
      

  7.   

    count这次赋值为800  -->  count这次赋值为808
    既不是count--(这个操作真的太诡异了),也不是只有异步才能接收数据,更不是只要把这个代码放到线程里它就不死掉了(这个逻辑也特别诡异)。
    while(count>0)可以改为while(ClientSocket.Avaliable>0)
      

  8.   

    sorry,是 while(ClientSocket.Available>0)
      

  9.   

    没有数据到达时就会阻塞,有数据会继续执行.不过你可能需要判断count,正常断开时count为0.你可能需要退出循环.
      

  10.   

    好多牛人啊,
    其实我并不觉得你这里的代码有什么问题啊.关键是,你这个ClientSocket从哪儿来的?!
      

  11.   


    ClientSocket是个变量,引用一个Socket类型的对象实例,这还有其它可能性吗?
      

  12.   

    所谓“代码的问题”,#1楼就说明了问题:“程序一直在等待接收数据,阻塞在这里”解释得那么明白了还看不出来到底是哪一句在等待接收数据:还以为是while(count>0)这一句造成等待吗?
      

  13.   

    如果纠结于什么count>0,就完全没有概念了。我问一个问题:count有可能为0吗
      

  14.   


    难道从服务器发送的数据不可能是0字节?我觉得应该是这样的吧:是我调用receive()方法从服务器接受数据,如果没数据返回的应该是0啊。怎么大家说的是反的,你们的意思是如果服务器没数据发送,我就不能调用这个方法?
      

  15.   

    先不说楼主代码的逻辑问题,楼主应该先注意一个问题
    Count = ClientSocket.Receive(buffer, buffer.Length, 0);
    这句,注意,不会有count为0的状况发生,如果ClientSocket读取不到数据,.net的默认策略是一直让程序阻塞在这里,直到能缓冲区有数据可以读取。
      

  16.   

    别指望高人能解决一切问题, 往往提问者给出的信息不完全, 再呼喊高人也没用。If no data is available for reading, the Receive method will block until data is available, unless a time-out value was set by using Socket..::.ReceiveTimeout.你确定你发了数据?
      

  17.   

    http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.aspx 微软的例子就是这样的 do {
                bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
                page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
            }
            while (bytes > 0);
      

  18.   

    肯定的告诉你,Count可以等于0.我测试过了,原来这不是个死循环,但是要退出确实是需要很久的。不知道该怎么解决。