2010-07-30 7 views
2

J'ai lu la documentation de Winsock2 sur MSDN, mais j'ai encore besoin d'éclaircissements sur certaines choses, si quelqu'un peut vous aider.C++ Winsock 2 questions

Je prévoyais de faire quelque chose comme l'installation que vous obtenez lorsque vous utilisez WSAAsyncSelect(), mais en utilisant un thread séparé. Puis-je utiliser WSAEventSelect() pour lier plus d'un socket à un objet événement unique?

Si j'utilisais un port d'achèvement à la place, quels événements dois-je passer par le port d'achèvement? Le MSDN a une liste en termes d'opérations de fichiers, mais j'ai eu du mal à les relier aux événements (FD_READ, FD_WRITE, ect ..) qui seraient envoyés via le port d'achèvement. Y a-t-il un moyen de savoir quel événement est en train de se terminer? ou dois-je prendre note de ceci et le stocker dans une structure chaque fois que j'envoie ou recv quelque chose?

merci pour toute l'aide * quelqu'un peut me donner sur ce = D

modifier: mieux encore, serais-je mieux passer juste C# pour le faire? Il semble être très populaire et mieux adapté à cette tâche spécifique.

+0

En général, j'utilise simplement les fonctions POSIX comme select(), plutôt que celles de Winsock. Ils semblent fonctionner correctement. –

Répondre

1

Non, vous ne pouvez pas relier plusieurs prises à un seul WSAEVENT. Vous devez appeler WSACreateEvent() et WSAEventSelect() pour chaque socket pour lequel vous souhaitez recevoir des notifications. Vous pouvez utiliser WSAWaitForMultipleEvents() pour qu'un seul thread attende des événements de plusieurs sockets, cependant.

En ce qui concerne l'utilisation des ports d'achèvement, je vous suggère de lire les articles de MSDN en la matière, tels que:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports.

+0

à l'époque je ne comprenais pas complètement les ports d'achèvement ... mais j'ai fait pas mal de lecture sur le sujet, et maintenant, ma configuration actuelle n'a pas du tout besoin d'objets d'événement. Je ne savais pas que AcceptEx() déclencherait le port de complétion, ce qui corrigeait à peu près mon problème. Merci – bitwise

1

[Disclaimer: J'ai une expérience très limitée avec la programmation socket.]

je comptais faire quelque chose comme le la configuration que vous obtenez lorsque vous utilisez WSAAsyncSelect(), mais en utilisant un fil séparé . Puis-je utiliser WSAEventSelect() pour lier plus d'une socket à un seul objet d'événement ?

Cela n'aurait pas de sens. Un événement peut simplement être signalé une fois. Donc, si vous avez plusieurs sockets connectés au même événement, alors quand il est signalé vous ne saviez jamais quelle socket a signalé l'événement!

Ce que vous pouvez faire est de créer un événement pour chaque prise (éventuellement plusieurs événements par socket: pour chaque événement FD_ * qui vous intéresse) et utiliser WSAWaitForMultipleEvents (http://msdn.microsoft.com/en-us/library/ms742219%28v=VS.85%29.aspx)

+0

c'est là que je suis confus. Si ce que vous dites est vrai, que se passerait-il si un socket avait deux événements de lecture consécutifs? l'API n'attendrait pas que WSAEnumNetworkEvents() soit appelé pour réinitialiser l'événement avant de le signaler à nouveau? – bitwise

+0

Je ne sais pas. Je ne m'attends pas à ce que l'API soit aussi intelligente. C'est-à-dire, oui, je m'attends à ce que l'événement ne soit défini qu'une seule fois. –