2009-10-22 5 views
2

J'ai écrit un client UDP asynchrone pour parler à un serveur de mon entreprise. Quand je cours sur mon développeur, tout va bien. Lorsque je déploie sur une autre machine, je reçois une exception de socket sur EndReceive la première fois que j'envoie des données sur le socket. Ma boîte de dev est Win7 et j'ai déployé à la fois une machine XP SP3 et une machine Server 2003 R2. Voici le code recevoir:VB.NET 3.5 SocketException lors du déploiement mais pas sur la machine de développement

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 

L'exception que je reçois est:

System.Net.Sockets.SocketException: L'opération d'E/S a été abandonnée en raison d'une sortie de fil ou une demande d'application à System.Net.Sockets.Socket.EndReceive (IAsyncResult asyncResult) à RTSPc.Connection.ReceiveCallback (IAsyncResult ar)

Le SocketException est OperationAborted

+0

C'est comme regarder quelqu'un se frapper au visage avec un marteau ... – Will

+0

Merci, c'est très utile. – jercra

Répondre

5

Il est probable tha La raison pour laquelle elle n'échoue pas sur votre boîte de dev est que le comportement sous-jacent du système d'E/S a été modifié dans Vista de sorte que les E/S superposées émises par un thread ne sont plus annulées lorsque le thread se termine.

Voir cette annonce sur mon blog à ce sujet: http://www.lenholgate.com/blog/2008/02/major-vista-overlapped-io-change.html

Maintenant, pourquoi vous obtenez le problème sur XP est la vraie question et de répondre que nous aurions probablement besoin de savoir un peu plus sur la façon dont vous émettons vos demandes d'E/S superposées et d'où. Courez-vous des fils de votre choix? Est-ce qu'ils émettent des demandes d'E/S?

+0

Votre billet de blog m'a indiqué dans la bonne direction. J'appelais la classe à partir d'un thread séparé qui a fini juste après l'appel d'envoyer sur le socket. Je vous remercie. – jercra

+0

Cool, je m'attendais à quelque chose comme ça. Il est dommage que les choses E/S .Net Async n'ont pas fait abstraction de la nature désordonnée de l'annulation d'E/S pré-Vista; Richter suggère de ne pas autoriser les threads ayant des E/S remarquables à quitter, mon approche consistait à rassembler la requête d'E/S réelle dans un pool de threads qui était sous mon contrôle et qui ne laissait jamais ses threads mourir. –

Questions connexes