2

会社のサーバーと通信するための非同期UDPクライアントを作成しました。開発者のマシンで実行すると、すべてうまくいきます。別のマシンにデプロイすると、ソケットを介して初めてデータを送信したときに、EndReceiveでソケット例外が発生します。私の開発ボックスは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:RTSPc.Connection.ReceiveCallback(IAsyncResult ar)のSystem.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)でのスレッド終了またはアプリケーション要求により、I/O操作が中止されました。

SocketExceptionはOperationAbortedです

4

1 に答える 1

5

開発ボックスで失敗しない理由は、I / Oシステムの基本的な動作がVistaで変更され、スレッドによって発行された重複したI/Oがスレッドの終了時にキャンセルされなくなったためである可能性があります。 。

これについての私のブログのこの投稿を参照してください:http://www.lenholgate.com/blog/2008/02/major-vista-overlapped-io-change.html

さて、XPで問題が発生する理由は本当の質問であり、重複するI / O要求をどのように発行し、どこから発行するかについてもう少し知る必要があると答える必要があります。独自のスレッドを実行していますか?彼らはI/Oリクエストを発行しますか?

于 2009-10-22T20:59:48.740 に答える