【问题标题】:VB.NET 3.5 SocketException on deployment but not on development machineVB.NET 3.5 SocketException 部署但不在开发机器上
【发布时间】:2009-10-22 20:15:30
【问题描述】:

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

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 是 OperationAborted

【问题讨论】:

  • 这就像看着有人用锤子敲自己的脸......

标签: vb.net .net-3.5 sockets iasyncresult


【解决方案1】:

它在您的开发盒上没有失败的原因很可能是 I/O 系统的底层行为在 Vista 中发生了更改,因此线程发出的重叠 I/O 在以下情况下不再被取消线程退出。

在我的博客上看到这个帖子:http://www.lenholgate.com/blog/2008/02/major-vista-overlapped-io-change.html

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

【讨论】:

  • 您的博文为我指明了正确的方向。我从一个单独的线程调用该类,该线程在套接字上调用 send 后立即完成。谢谢。
  • 酷,我希望它是这样的。遗憾的是,.Net Async I/O 的东西并没有抽象出 Vista 之前取消 I/O 的杂乱本质; Richter 建议根本不允许具有未完成 I/O 的线程退出,我的方法是将实际的 I/O 请求编组到一个线程池中,该线程池在我的控制之下并且永远不会让它的线程死亡。
猜你喜欢
  • 2013-06-30
  • 2010-10-27
  • 2015-08-19
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2011-02-20
  • 2012-01-04
  • 2015-07-04
相关资源
最近更新 更多