2008-12-28 13 views
5

Estoy transfiriendo algún código de sockets BSD a Winsock, y no estoy seguro de cómo manejar el caso a continuación.Mezcla de identificadores de archivos y sockets en Winsock

Mi solicitud original se ejecuta una selección en tanto la entrada estándar y la toma de red:

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

Intentar ejecutar esto en Winsock da un error 10038 (WSAENOTSOCK), lo cual tiene sentido, ya que lo que era identificador de archivo 0 en Linux (stdin) no es un socket (más precisamente: un tipo SOCKET) en Windows.

¿Existe alguna manera fácil de llevar esta prueba a los sockets de Windows?

Respuesta

1

Winsock's select() solo funciona con sockets. Una alternativa más 'Windows-y' sería usar Asynchronous I/O en ambos controladores y luego WaitForMultipleObjects.

+0

gracias Máx. Voy a intentar esto hoy. Sin embargo, es un poco una pena; Esperaba tener una capa de portar Winsock; parece que esto requerirá un poco más de una reescritura que había imaginado. Oh bien. – Mikeage

+1

No puede usar IO superpuesto en un mango a menos que se haya creado de una manera especial. En particular, esto significa que no podrá usar IO superpuesto en identificadores heredados, como las tres corrientes estándar. –

2

Me encantaría que me corrigieran, pero hasta donde yo sé, Winsock no se extiende más allá del ámbito de los sockets. Es decir, la filosofía de "todo es un archivo" de Unix para las llamadas al sistema select(), read(), write(), etc. no está en Winsock.

Estoy seguro de que puedes hacer algo similar con solo la API de Win32 trabajando en los mangos de socket y consola, pero ya no se parecerá mucho a Winsock (o BSD).

+0

Creo que tienes razón, pero espero que no; es por eso que he preguntado. El problema es que necesito escanear dos fuentes de entrada diferentes, y atender al primero que tiene datos. select() en Unix lo hace fácil; Sin embargo, no sé cómo hacer esto en Windows (y no quiero cygwin). – Mikeage

+0

Maldición. Iba a sugerir cygwin después. :) –

+0

Estoy portando una aplicación que ya compila con cygwin, pero también me gustaría una solución MinGW. Estar ligado a un cygwin1.dll particular en un sistema con muchos nunca es divertido. – Mikeage