2010-06-26 28 views
1

J'ai créé un simple programme client fictif/client fictif en utilisant IOCP à des fins de test/profilage. (Et je voulais aussi noter que je suis nouveau à la programmation réseau asynchrone)ConnectEx avec un problème IOCP

Il semble que le serveur fonctionne bien avec le client d'origine, mais lorsque le client factice tente de se connecter au serveur avec la fonction ConnectEx, thread IOCP Worker est toujours bloqué par la fonction GetQueuedCompletionStatus et ne renvoie jamais de résultat tant que le serveur réussit à accepter la connexion.

Quel est le problème et/ou la raison, et comment dois-je faire pour résoudre ce problème?

+0

S'il vous plaît montrer plus de code. Quoi qu'il en soit, que fait-il lorsque vous essayez de telnet votre serveur? (telnet localhost , très utile en tant que client tcp simple). –

+0

Je suis désolé que je ne peux pas vous montrer le code réel parce qu'il est basé sur la bibliothèque de notre société, mais le squelette du client peut être décrit comme ci-dessous: WSAStartup -> Créer IOCP -> Lancer la discussion Worker -> Get ConnectEx avec IOCtl -> Bind prise -> Appeler ConnectEx -> Allouer le socket à IOCP. Et je reçois "Socket est déjà connecté." erreur avec WSAGetLastError lorsque j'essaie de me connecter au serveur à plusieurs reprises. Je vais essayer de telnet mon serveur demain. Je vous remercie! – summerlight

+0

Il semble que cela fonctionne correctement lorsque ConnectEx est appelé sur un nouveau thread à des fins de connexion seulement, mais je ne sais toujours pas quelle est la raison exacte de ce problème. – summerlight

Répondre

0

Même après que vous associez votre prise accepté de IOCP, votre thread de travail reste bloqué sur GetQueuedCompletionStatus jusqu'à ce que vous postez un « déverrouillage » événement d'achèvement. Les événements de fin d'opération de réception/écriture ne seront pas envoyés par le système à moins que vous ne "déverrouilliez" votre nouveau socket. Pour plus de détails, ckeck le code source de Push Framework http://www.pushframework.com Il s'agit d'une structure d'application réseau C++ utilisant IOCP. L'astuce de "déverrouillage" existe dans la classe "IOCPQueue".

+1

Code intéressant ... IMHO vous créez incorrectement ce IOCP, comme le socket factice que vous créez pour créer le IOCP n'est pas créé pour l'utilisation de chevauchement que vous utilisez socket() et pas WSASocket() ' avec 'WSA_FLAG_OVERLAPPED' voir les documents pour http://msdn.microsoft.com/en-us/library/aa363862(VS.85).aspx en ce qui concerne l'exigence" ouverture pour chevauchement des E/S terminées "pour le socket. Deuxièmement, si tout ce que vous utilisez pour cette première socket est de créer l'IOCP, vous pouvez simplement passer 'NULL'. Troisièmement, je n'ai jamais trouvé que tout «déverrouillage» est nécessaire lors de l'utilisation des IOCP que les documents suggèrent que vous devriez. –

+0

En ce qui concerne le commentaire de Len ci-dessus, selon: http://msdn.microsoft.com/en-us/library/ms740506%28v=vs.85%29.aspx dans la section Remarques: "Le socket créé aura le attribut chevauché par défaut " –

2

Je pense que vous répondez à votre question avec votre commentaire.

Votre séquence d'événements est incorrecte, vous dites que vous Bind, ConnectEx, associé à IOCP.

Vous devez Bind, associer la prise avec le IOCP et appeler ALORS ConnectEx.