2009-10-09 6 views
0

Erreur: Impossible de lire les données de la connexion de transport: une opération de blocage a été interrompue par un appel àImpossible de faire 2 requêtes TCP parallèles au même TCP Client

WSACancelBlockingCall

Situation

  1. Il est un serveur TCP
  2. Mon application web se connecte à ce serveur TCP

    en utilisant le code ci-dessous:

    TcpClientInfo = new TcpClient(); 
    _result = TcpClientInfo.BeginConnect(<serverAddress>,<portNumber>, null, null); 
    bool success = _result.AsyncWaitHandle.WaitOne(20000, true); 
    
    if (!success) 
    { 
        TcpClientInfo.Close(); 
        throw new Exception("Connection Timeout: Failed to establish connection."); 
    } 
    
    NetworkStreamInfo = TcpClientInfo.GetStream(); 
    NetworkStreamInfo.ReadTimeout = 20000; 
    
  3. 2 Les utilisateurs utilisent la même application de deux autre emplacement pour accéder aux informations de ce serveur au MÊME TEMPS

  4. serveur prend environ 2sec pour répondre
  5. deux Connect
  6. Mais un de l'utilisateur gets above error "Impossible de lire les données de la connexion de transport: une opération de blocage a été interrompue par un appel à WSACancelBlockingCall" lors de la tentative de lecture des données du flux

Comment puis-je résoudre ce problème?

  1. Utilisez une meilleure façon de se connecter au serveur
  2. ne peut pas parce qu'il est un problème de serveur
    • si un problème de serveur, comment la demande de la poignée du serveur pour éviter ce problème
+0

Vous devez inclure la langue que vous programmez en tant que balise sur la question. – dcrosta

Répondre

0

Cela semble me Windows spécifique, ce qui est pas mon point fort, mais ...

Vous ne nous montre pas le code du serveur, seul le code client. Je peux seulement supposer, alors, que votre code de serveur accepte une connexion de douille, fait sa magie, renvoie quelque chose, et ferme la connexion de client. Si c'est votre cas, alors c'est le problème.

L'appel accept() est un blocage qui attend la prochaine tentative de connexion du client et s'y lie. Il peut y avoir une file d'attente de tentatives de connexion créée et administrée par le système d'exploitation, mais elle ne peut toujours accepter qu'une seule connexion à la fois. Si vous voulez gérer plusieurs requêtes simultanées, vous devez changer votre serveur pour appeler accept(), et lorsqu'une nouvelle connexion arrive, lancer un thread/processus de travail pour gérer la requête et revenir à le haut de la boucle où l'accept() est. Ainsi, la boucle principale transmet le travail réel à un autre thread/processus afin qu'il puisse revenir à l'attente de la prochaine tentative de connexion.

Les applications serveur réelles sont plus complexes que cela. Ils lancent un tas de threads/processus "worker bee" dans un pool et les réutilisent pour de futures requêtes. Les serveurs Web le font, par exemple.

Si mes suppositions concernant votre code serveur sont erronées, veuillez nous éclairer sur ce à quoi cela ressemble.

+0

Merci pour cela. J'ai fini par créer un serveur comme vous l'avez mentionné et j'ai eu des erreurs différentes. L'erreur était due à la réutilisation du même objet TCP à partir d'un objet persistant dans l'application. – soldieraman

0

Juste une idée.

Si votre serveur prend 2seconds à la réponse, ne devrait pas les valeurs de délai d'attente être 2000, au lieu de 20000 (qui est de 20 secondes)? Le premier argument pour AsyncWaitHandle.WaitOne() est en millisecondes.

Si vous attendez 20 secondes, votre serveur est peut-être en train de vous déconnecter pour être inactif?

+0

Je m'assure qu'une fois qu'une réponse valide est reçue, la connexion TCP est déconnectée. Une nouvelle connexion TCP est créée pour chaque requête. – soldieraman