下面的代码是使用socket通讯接收来自服务器发送的信息
我的程序的通讯原理是:
1.发送请求1
2.发送请求2
. ...
N。发送请求N
然后是接收
下面是接收代码(所有的接收的信息采用的是接收两次)
数据头:16byte
数据体:260byte,
总是 数据头+数据体的方式接收。 public bool SafeRecvData(Socket sock, ref byte[] buff, int nLen)
        {
            try
            {
                int recLen = 0;
                int tmpLen = 0;
                while (tmpLen < nLen)
                {
                    byte[] btmp = new byte[nLen - tmpLen];
                    sock.Blocking = true;
                    try
                    {
                        recLen = sock.Receive(btmp);
                    }
                    catch (Exception ex)
                    {
                        string s = ex.Message;//报错位置
                    }
                    tmpLen = tmpLen + recLen;
                    for (int i = tmpLen - recLen; i < tmpLen; i++)
                    {
                        buff[i] = btmp[i - tmpLen + recLen];
                    }
                }
            }
            catch (Exception ex)
            {
               IOHelper.WriteLog("接收行情错误(错误类型1):" + ex.Message);
               return false;
            }
            return true;
        }
上面的代码在程序开启的前几秒钟没有任何问题,几秒钟以后报错。
捕获的错误是:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
查看sock的Connected属性,发现Connected为false,也就是说在接收的时候连接中断了。
请问这个问题应该如何解决。忘各位高手不吝赐教

解决方案 »

  1.   

    问题都类似  看看....
    http://topic.csdn.net/u/20090922/14/790c0084-0849-420d-8593-6eeeab57286d.html
      

  2.   

    这个我知道,现在的问题就是,在receive的时候出现了连接断开的情况,主要是想解决这个问题
      

  3.   

    是不是,第一次还没有处理完,第二次双发冲死了,加个SELLP试一下吧
      

  4.   

    如果你这个函数一次都没通过的话,,可能是Socket sock在传进来就断开连接了这代码看不出来什么问题
      

  5.   

    要确定你的服务器端是长连接?
    另外nLen你确定每次都是276?
      

  6.   

    不是我通过一次请求,服务器将发两次给我
    第一次16字节
    第二次260字节另外可以肯定socket在接收时中断的,我断点测试过,在                   sock.Blocking = true;
    设置断点,条件时sock.Connectioned==false结果是并没有停下而自己进入了catch 里面
      

  7.   

     sock.Blocking = true;
    为什么要用这个呢?我用时如果一个包分两次取,就会经常出现这种问题;
    但是一次取就没问题了;然后在每次取完后做个判断,如果socket连接断开,就重新连
      

  8.   

    这个代码看不出来,或许你其他地方有问题。
    另外为什么你不用异步Socket接收数据。
      

  9.   

    可能是你协议处理的有问题。
    同步接收一个信息可以使用下面的方法。看着比你的简洁些:
    void ReceiveVarData(int packageLength, Socket sock, byte[] recBuffer) {
                if (_isClosed) return;
                int total = 0;
                int recv = 0;            int dataleft = packageLength;
                SocketError sError;
                while (total < packageLength) {                recv = sock.Receive(recBuffer, total, dataleft, SocketFlags.None, out sError);
                    //
                    //这部分是处理断线的情况。
                      //
                    if (!CheckRecSocketError(recv, sError)) {
                        Close();
                        return;
                    }
                    total += recv;
                    dataleft -= recv;
                }
            }
      

  10.   

    连接超时了吧
    看你代码里边没有判断recLen 为0的情况,如果为0了可能发送端已经关闭socket了
    你这边接收端就没有用了
      

  11.   

    如果确实是连接断开了,你要判断连接状态及断开重连的机制。另,Connected表示的不是链接的当前连接状态 。
    详细信息看MSDN
      

  12.   

    建议在try里加入
    try
    {
    if(sock!=null&&sock.Connected)
    {
    //do something 
    }
    }
    catch
    {
    }