2009-10-22 2 views
2

회사의 서버와 통신하기 위해 비동기 UDP 클라이언트를 작성했습니다. 내 개발자 컴퓨터에서 실행하면 모두 잘됩니다. 다른 컴퓨터에 배포 할 때 소켓을 통해 데이터를 처음 보낼 때 EndReceive에서 소켓 예외가 발생합니다. 내 개발자 박스는 Win7이고 XP SP3 머신과 Server 2003 R2 머신 모두에 배포했습니다. 다음은 수신 코드는 다음과 같습니다VB.NET 3.5 배포시 SocketException이 있지만 개발 컴퓨터에 없습니다.

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 작업이 스레드 종료 또는 응용 프로그램 요청이 취소되었습니다 RTSPc.Connection.ReceiveCallback에서 System.Net.Sockets.Socket.EndReceive (IAsyncResult를 asyncResult) 의 SocketException이 OperationAborted됩니다

(IAsyncResult를 아칸소)에서

+0

마치 망치로 얼굴을 때리는 모습을 보는 것 ... – Will

+0

감사합니다. 매우 도움이됩니다. – jercra

답변

5

그것은 가능성이 그쪽이다 당신의 dev 상자에서 실패하지 않는 이유는 스레드가 종료 될 때 스레드에 의해 발행 된 중복 된 I/O가 더 이상 취소되지 않도록 I/O 시스템의 기본 동작이 Vista에서 변경되었다는 것입니다. http://www.lenholgate.com/blog/2008/02/major-vista-overlapped-io-change.html 이제

, 당신은 XP에 문제가 있어요 왜 것은 진짜 문제이며, 우리는 아마 방법을 대해 좀 더 알 필요가 거라고 대답 :

이것에 대해 내 블로그에 게시물을 참조하십시오 중첩 된 I/O 요청을 어디에서 발급 받았 는가? 당신은 당신 자신의 스레드를 실행하고 있습니까? I/O 요청을 발행합니까?

+0

블로그 게시물이 올바른 방향으로 나를 지적했습니다. 소켓에서 보내기를 호출 한 직후 완료된 별도의 스레드에서 클래스를 호출했습니다. 고맙습니다. – jercra

+0

멋지다, 나는 그것이 그와 비슷한 것으로 기대했다. .NET 비동기 I/O가 비스타 이전 I/O 취소의 지저분한 특성을 추상화하지 않았다는 것은 유감스러운 일입니다. Richter는 현저한 I/O를 가진 스레드가 전혀 종료하지 못하도록 제안했다. 나의 접근 방식은 실제 I/O 요청을 내 제어하에 있고 스레드가 죽지 않도록하는 스레드 풀로 마샬링하는 것이었다. –

관련 문제