SOCKET在同步传输文件时,可通过设置TIMEOUT监视数据发送或接收超时情况。请问下异步传输有监视的办法吗?特别是传输文件时,数据量比较大,有时要是其中一方断开了连接,代码中连错误都不报,这该怎么办啊?        private void SendData(TcpClient t, string StrData)
        {
            
            byte[] byteData = System.Text.Encoding.Default.GetBytes(StrData);            try
            {
                t.Client.BeginSend(byteData, 0, byteData.Length, 0,
                    new AsyncCallback(SendCallback), t);
            }
            catch (Exception e)
            {
                //return e.Message;
            }
        }这里是我写的发送数据的部分,在2用户建立连接后发送文件,可是接收方在断开连接的情况下,希望能够报错。但使用TRY--CATCH捕捉不到,请问下怎么回事啊?有什么办法捕捉到错误码?

解决方案 »

  1.   

    这样捕捉是捕捉不到的异常的,链接被断开后,会在SendCallback出现回调结果,应该在SendCallback函数里判断,SendCallback首先判断数据是否已经收完,然后判断t.Connected是否链接正常。
      

  2.   

    又碰到tcp/ip的问题我收藏了个类库,呵呵,一个个传太麻烦了,贡献出来吧(收两分哈)点击这里
      

  3.   

    SendCallback
    这个里面的方法才是最主要的回调你贴出来
      

  4.   

    简单的发送部分是这样的:
    数据接入:CMD为要发送的数据
            public void SendCommand(string cmd)
            {
                try
                {
                    Client.Client.Connect(Remote_Ipendpoint);
                }
                catch (Exception se)
                {
                    //throw se;
                }
                try
                {
                    SendData(Client, cmd);
                }
                catch (Exception e)
                {
                    //return e.Message;
                }
            }异步回调函数:
            private void SendCallback(IAsyncResult ar)
            {
                try
                {
                    TcpClient client = (TcpClient)ar.AsyncState;
                    int bytesSent = client.Client.EndSend(ar);//如果成功返回发送的字节数,这里可能还需要加判断                //如果成功发送后开始接受数据
                    StateObject state = new StateObject();
                    state.workSocket = client;
                    client.Client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback), state);
                }
                catch (Exception e)
                {
                    //return e.Message;
                }        }确实如上面所说,错误会在SENDCALLBACK这个回调函数中出现,但是好像因为不是一个线程的问题,错误无法反馈到SendCommand这个函数中!
      

  5.   

    我把SendCallback函数贴出来了,怎么改下好呢?因为是编写的一个类,我应该怎么把错误传递到上层应用?
      

  6.   

    if (!client.Client.Connected)
                { 
                    //链接中断
                    return;
                }
                if (bytesSent == 0)
                { 
                    //发送失败,断开链接
                    return;
                }
                //开始接收
                //........
    .net中已经有封装好的异步NET IO了,性能很好,用起来很方便,不需要自己再创建异步对象,你可以参考
    IOCP