2008-12-28 6 views
5

Je transfère du code de sockets BSD à Winsock, et je ne suis pas sûr de savoir comment gérer le cas ci-dessous.Mélange de poignées de fichiers et de sockets dans Winsock

Ma demande initiale exécute une sélection à la fois stdin et la prise réseau:

FD_SET(sock, &fd); 
FD_SET(0, &fd); 
... 
if (select(..., &fd, ...)...) 

Essayer de tourner ceci dans Winsock donne une erreur 10038 (WSAENOTSOCK), ce qui est logique, puisque ce qui était descripteur de fichier 0 dans Linux (stdin) n'est pas une socket (plus précisément: un type SOCKET) dans Windows.

Existe-t-il un moyen facile de porter ce test sur les sockets Windows?

Répondre

1

Winsock select() ne fonctionne qu'avec des sockets. Une alternative plus «Windows-y» serait d'utiliser Asynchronous I/O sur les deux poignées, puis WaitForMultipleObjects.

+0

merci Max. Je vais essayer ça aujourd'hui. C'est un peu dommage, cependant; J'espérais avoir une couche de portage winsock; il semble que cela nécessitera un peu plus d'une réécriture que j'avais envisagée. Tant pis. – Mikeage

+1

Vous ne pouvez pas utiliser des E/S superposées sur un descripteur sauf s'il a été créé d'une manière spéciale. En particulier, cela signifie que vous ne pourrez pas utiliser des E/S superposées sur des handles hérités, tels que les trois flux standard. –

2

J'aimerais bien être corrigé, mais pour autant que je sache, Winsock ne s'étend pas au-delà du domaine des sockets. Autrement dit, la philosophie "tout est un fichier" d'Unix pour les appels système select(), read(), write(), etc. n'est pas présente dans Winsock.

Je suis sûr que vous pouvez faire quelque chose de similaire avec seulement l'API Win32 qui fonctionne sur les poignées de socket et de console, mais ça ne ressemblera plus à Winsock (ou BSD).

+0

Je pense que vous avez raison, mais j'espère que non; C'est pourquoi j'ai demandé. Le problème est que j'ai besoin de scanner deux sources d'entrée différentes, et d'assister à la première qui a des données. select() dans Unix le rend facile; Je ne sais pas comment faire cela dans Windows, (et je ne veux pas de cygwin). – Mikeage

+0

Merde. J'allais suggérer cygwin ensuite. :) –

+0

Je suis en train de porter une application qui est déjà compilée avec cygwin, mais j'aimerais aussi une solution MinGW. Etre lié à un cygwin1.dll particulier sur un système avec beaucoup n'est jamais amusant. – Mikeage

Questions connexes