是么,测试一下,把源码发来看看,
微软的。NET平台也实在太大了,没办法的

解决方案 »

  1.   

    TO:nga96() 
    怎么发给你呢?
      

  2.   

    给个俺学习学习
    [email protected]
      

  3.   

    发个过来学习学习[email protected]
      

  4.   

    也给我发一份吧!
    [email protected]
    多谢?有空多交流!
      

  5.   

    一般来讲,服务器端都有如下代码
    public static void AcceptCallback(IAsyncResult ar)
    {
    try
    {
    Socket listener = (Socket)ar.AsyncState;
    //new socket
    handler = listener.EndAccept(ar);这里的handler应该是包含状态的,也说handler包含了客户端和服务器端连接的信息,它知道哪个客户端连接上来了,可以通过handler.RemoteEndPoint获取客户端的信息,
    在Exception中判断SocketException.ErrorCode对固定的handler(判断是否为断开的那个handler)进行处理,而不要用缺省的Exception处理
      

  6.   

    如果应用程序在执行期间只需要一个线程,请使用下面的方法,这些方法适用于同步操作模式。 如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用 Listen 方法侦听连接。Accept 方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。可以使用此返回的 Socket 来调用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口号,请在调用 Listen 方法之前先调用 Bind 方法。如果不调用 Bind,基础服务提供程序将为您分配这些值。此后,可以使用 LocalEndPoint 属性来标识分配给 Socket 的 IP 地址和端口号。如果想连接到侦听主机,请调用 Connect 方法。若要进行数据通信,请调用 Send 或 Receive 方法。 
    如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用 ReceiveFrom 方法可接受任何传入的数据报。使用 SendTo 方法可将数据报发送到远程主机。 
    --------------------------------------------------------------------------------
    若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。 如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。 
    如果当前使用的是无连接协议(如 UDP),则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。
    ================================================================
    以上是MSDN帮助中的内容,证明异步socket是多个线程的,发生异常时只需要处理其中异常的线程
      

  7.   

    TO:37350792(嵇幼雄-不算高手)发过去了.TO:wangsaokui(无间道III(终极无间))那些我也看过.但也没解决了我的问题.
      

  8.   

    这个我不是很理解,在BeginSend 之前没有建立连接,当然也就不存在错误啦?是不是这个意思咯~~
      

  9.   

    不是的,在BeginSend这前已经建立了连接啦.
      

  10.   

    但当服务器端的 Socket 调用过 BeginSend 以后,客户端如果是意外断开的话,到int bytesRead = handler.EndReceive(ar); 这句就会出错,抛出的异常是 "远程主机强迫关闭了一个现有的连接",而且一个客户端意外断开所有的连接抛出这样的异常所有的连接都断开了.
    ---------------------------------------
    检查一下是不是还有数据没有处理完
      

  11.   

    当应用程序调用 BeginSend 时,系统将使用一个单独的线程来执行指定的回调方法,并阻塞 EndSend,直到 Socket 发送了请求的字节数或引发了异常为止。如果希望在调用 BeginSend 方法之后使原始线程阻塞,请使用 WaitHandle.WaitOne 方法。如果希望原始线程继续执行,请在回调方法中调用 Set。
      

  12.   

    楼上的大侠
    在你的程序里面调用 BeginSend 之后,如果客户端意外断开,程序走到int bytesRead = handler.EndReceive(ar); 也不会出错吗?请你给我段原码看看,好吗?