部署时出现VB.NET 3.5 SocketException,但开发计算机上没有
我已经编写了一个异步UDP客户端来与我公司的服务器通信。当我在我的开发人员机器上运行时,一切都很好。当我部署到另一台机器时,当我第一次通过套接字发送数据时,EndReceive上会出现套接字异常。我的dev box是Win7,我已经部署到xpsp3机器和server2003r2机器上。以下是接收代码:部署时出现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
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请求封送到我控制的线程池中,该线程池决不会让线程死亡。