部署时出现VB.NET 3.5 SocketException,但开发计算机上没有

部署时出现VB.NET 3.5 SocketException,但开发计算机上没有,vb.net,.net-3.5,sockets,iasyncresult,Vb.net,.net 3.5,Sockets,Iasyncresult,我已经编写了一个异步UDP客户端来与我公司的服务器通信。当我在我的开发人员机器上运行时,一切都很好。当我部署到另一台机器时,当我第一次通过套接字发送数据时,EndReceive上会出现套接字异常。我的dev box是Win7,我已经部署到xpsp3机器和server2003r2机器上。以下是接收代码: Private Sub ReceiveCallback(ByVal ar As IAsyncResult) Try ' Retrieve the state object

我已经编写了一个异步UDP客户端来与我公司的服务器通信。当我在我的开发人员机器上运行时,一切都很好。当我部署到另一台机器时,当我第一次通过套接字发送数据时,EndReceive上会出现套接字异常。我的dev box是Win7,我已经部署到xpsp3机器和server2003r2机器上。以下是接收代码:

Private Sub ReceiveCallback(ByVal ar As IAsyncResult)
    Try
        ' Retrieve the state object and the client socket 
         from the asynchronous state object.'

        Dim state As StateObj = CType(ar.AsyncState, StateObj)
        Dim client As Socket = state.sockArg

        ' Read data from the remote device.'
        Dim bytesRead As Integer
        receiveDone.WaitOne(Timeout.Infinite)

        bytesRead = client.EndReceive(ar)
        If bytesRead > 0 Then
            Dim s As String = Encoding.ASCII.GetString(state.buffer, 0, bytesRead)
            parsedata(s)
        End If
    Catch SockEx As SocketException
        mlog.Error(String.Format("ID={1} {0} SocketError={2}", SockEx.Message, ID.ToString, SockEx.SocketErrorCode.ToString), SockEx)
    Catch ox As System.ObjectDisposedException
        mlog.Warn(String.Format("Object Disposed ID={0}", ID.ToString))
    Catch ex As Exception
        mlog.Error(String.Format("{1} ID={0}", ID.ToString, ex.Message), ex)
    End Try
End Sub 'ReceiveCallback
我得到的例外是:

System.Net.Sockets.SocketException:由于线程退出或应用程序请求,I/O操作已中止 位于System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 在RTSPc.Connection.ReceiveCallback(IAsyncResult ar)上


SocketException是OperationBorted

它在您的dev box上没有失败的原因可能是,I/O系统的基本行为在Vista中发生了更改,因此线程发出的重叠I/O在线程退出时不再被取消

请参阅我的博客上关于以下内容的帖子:


现在,您为什么会在XP上遇到问题才是真正的问题,要回答这个问题,我们可能需要更多地了解您是如何发出重叠I/O请求的,以及从何处发出重叠I/O请求的。您是否正在运行自己的线程?他们是否发出任何I/O请求?

这就像看到有人用锤子砸自己的脸……你的博客文章为我指明了正确的方向。我从一个单独的线程调用该类,该线程在套接字上调用send之后立即完成。谢谢。酷,我以为会是那样的。遗憾的是,.Net异步I/O的东西并没有抽象出Vista之前I/O取消的混乱本质;Richter建议根本不允许具有未完成I/O的线程退出,我的方法是将实际I/O请求封送到我控制的线程池中,该线程池决不会让线程死亡。