看看你的异常处理是不是自己关闭了socket的连接,异步是采用回调方式工作的,当有数据到达或者发送时会回调相应的方法,自己不会关闭连接的

解决方案 »

  1.   


    很标准的写法:client.BeginReceive(buffer, 0, 4, SocketFlags.None, new AsyncCallback(ReceiveCallback), client);在程序启动时每次都可以接受到字节和每次都有包需要发送的情况下程序是没有问题的,但是中间出现接收不到字节或不需发送包的情况下就会抛出异常。
      

  2.   

    在程序启动时每次都可以接受到字节和每次都有包需要发送的情况下程序是没有问题的,但是中间出现接收不到字节或不需发送包的情况下就会抛出异常。你应该增加结束字符,然后判断是否接收结束,收不到字节的时候就WaitOne,等它收到再做处理,而不应该是BeginSend没有发送的包时,在最前面加上
    public static ManualResetEvent socketEvent = new ManualResetEvent(false);
    然后socketEvent.Set,程序返回继续执行
      

  3.   

    可以参考一下这个代码.
    http://dev.csdn.net/develop/article/33/article/33/33381.shtm
      

  4.   


    to wangsaokui:我的BeginReceive都是接收指定长度的字节,故可以判断得到是否结束,如果我要接收4个字节的包,是否在没有接收到的情况下socket都是一直阻塞?还是说会继续往下走?如果使用WaitOne,在接收不到字节的情况下是否会导致socket一直阻塞而不能进入BeginSend?
      

  5.   

    BeginReceive之前你要先调用Socket.Poll,或Select检查是否有数据可读。没有数据可读,你调用BeginReceive有什么用。
      

  6.   


    Poll和Select不能用于异步Socket吧?
      

  7.   

    select当然可以用于异步的socket,但是在C#中的异步回调应该已经是在发送了去read的消息后发生的,即此时的receive,没有包的时候按理是不会去接收的,我的处理一般都是当发现接收包为0或者小于0就关闭这个socket,这个时候应该是已经发生了错误,这也是符合tcp协议的
      

  8.   


    那就是说在没有字节可以接收的情况下调用socket.BeginReceive的话是会抛出异常的?
      

  9.   

    顶,偶也遇到同样的问题。
    没有字节可以接收的情况下调用socket.BeginReceive的话是会抛出异常的?---不会的,偶的程序就是不断的收到字节是0的数据,不知道是什么东东,结果速度很快的反复调用BeginReceive时就抛出“您的主机中的软件放弃了一个已建立的连接。”的异常。
    郁闷中!
    需高手解答!
      

  10.   

    EndSend时数据不一定都已经发完了, 
    同样EndReceiver时数据也不一定接收完了,
    需要判断有效返回或发出的字数, 
    直到数据完全发送出去或完全接收到期望长度为止,
    否则很容易造成通讯不同步导致另一方关闭套接字的,
    另外对接收到0字节的情况建议延时一小段时间再重新接收,
    避免cpu陷入100%空循环,
    个人建议如果性能要求不太高的话还是采用阻塞方式来做, 
    可控性比较强,代码也比较易维护
      

  11.   

    没有看到代码,不敢乱说。
    不过感觉是你的流程有问题:可能会有对同一个socket反复的BeginReceiver和BeginSend,这样就会导致异常抛出。