2009-10-05 23 views
22

Solo intentaba construir netcat en MSYS utilizando MinGW y me di cuenta de que MinGW nunca transportaba realmente todas las conexiones de BSD a Windows (por ejemplo, sys/socket.h). Sé que puede usar Windows Sockets en MinGW, pero ¿por qué nunca crearon un puerto de Windows para los sockets BSD? Noté bastantes programas usando # ifdef's para solucionar el problema. ¿Hay un puerto de Windows de los enchufes BSD en alguna parte que pueda usarse en su lugar?Enchufes en MinGW

Éstos son los errores cuando se hace una marca de netcat en MSYS:


gcc -DLOCALEDIR=\"\/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -Wall -c `test -f 'core.c' || echo './'`core.c 
In file included from core.c:29: 
netcat.h:38:24: sys/socket.h: No such file or directory 
netcat.h:39:63: sys/uio.h: No such file or directory 
netcat.h:41:24: netinet/in.h: No such file or directory 
netcat.h:42:55: arpa/inet.h: No such file or directory 
 

No hay #ifdef de para MinGW. ¿Existe una biblioteca/paquete que pueda agregar a MSYS para hacer que todo se compile sin errores?

Nota: Usted puede descargar netcat here y navegar por el repositorio CVS here

+0

Winsock fue originalmente un puerto de la API de sockets de Berkeley. – ChrisW

+0

@ChrisW, nunca he entendido cuál es el punto de hacer que Winsock sea diferente de UNIX. – Pacerier

+0

@Pacerier Creo que Winsock es más simple ya que tiene menos archivos de encabezado para incluir. Ver p. [Transición de UNIX a Windows Socket Programming] (http://cs.baylor.edu/~donahoo/practical/CSockets/WindowsSockets.pdf) para más detalles. – ChrisW

Respuesta

2

Como dijo ChrisW, Winsock2 es un puerto de sockets BSD. ¿Qué parte de winsock estás tratando de usar que difiere de los conectores BSD? (aparte de WSAStartup y WSACleanup)

+2

Solo estoy tratando de compilar netcat. Actualizaré la pregunta con los errores actuales. – User1

+1

Reemplazar todos esos incluye con '#include ' ya que sería el encabezado equivalente para winsock, luego vea qué pasa. – GRB

+3

si haces eso, también necesitarás un enlace contra ws2_32 y usar WSAStartup/WSACleanup. Que * podría * ponerte en marcha. – tmpvar

3

MingWin es minimalista, y eso es lo más importante. Debido a que hace que sea más fácil de entender, al final es responsabilidad del desarrollador escribir la aplicación. MingWin solo hace las cosas más fáciles pero no tiene magia en turing nix apps para Windows.

+0

¿Se supone que debemos escribir dos copias de código para cada funcionalidad? ¿Cuándo tiene sentido esto? – Pacerier

6

WinSock y WinSock2 tienen nombres de funciones diferentes de los zócalos BSD. Si deseo escribir aplicaciones multiplataforma, entonces tengo muchos códigos para mantener a Microsoft feliz.

Sería mucho más fácil si hubiera archivos especiales "socket.h" y "socket.c" incluidos con MinGW que simplemente traducen cosas llamando a las contrapartes respectivas de WinSock2.

Estoy empezando a aprender programación C, así que no puedo hacerlo yo solo, pero me sorprende que nadie parece haber intentado esto hasta el momento.

21

BSD sys/socket.h es un encabezado POSIX y la API win32 no es compatible. Los encabezados MinGW son solo una reimplementación de los encabezados win32 nativos y no ofrecen compatibilidad POSIX adicional.

Si está buscando la compatibilidad con sys/socket.h, intente GNU gnulib sys/socket.h replacement o vaya con Cygwin, que proporciona una envoltura de compatibilidad POSIX en Windows.

+4

Acabo de notar que la pregunta tiene casi 2 años. Aún así, tal vez la respuesta sea útil para alguien en el futuro. – kalev

+0

sobre gnulib for mingw: "algunos módulos no están soportados actualmente en mingw: mgetgroups, getugroups, idcache, userspec, openpty, login_tty, forkpty, pt_chown, grantpt, pty, savewd, mkancesdirs, mkdir-p, euidaccess, faccessat.", " mingw en el modo de 64 bits no está probado y de baja prioridad hasta el momento "http://www.gnu.org/software/gnulib/manual/gnulib.html#Target-Platforms –

+0

@kalev, nunca entendí esto. ¿Cuál es el punto de gnulib cuando ya hay cygwin? – Pacerier

4

Estos comentarios de otra respuesta sirvieron como la respuesta que necesitaba para obtener un simple código de socket bsd para compilar con mingw en Windows.

reemplazar todos los incluye con # include ya que ello ser la cabecera equivalente para el Winsock, y luego ver qué pasa.

También deberá realizar un enlace contra ws2_32 y utilizar WSAStartup/WSACleanup. Lo cual podría ponerlo en funcionamiento.

EDIT: también terminé tener que reemplazar close con shutdown/closesocket y write con send. El código compilado bien, pero en realidad no funcionó sin esos cambios adicionales.

2

¿Existe una biblioteca/paquete que pueda agregar a MSYS para hacer que todo se compile sin errores?

MSYS es una horquilla de Cygwin. Proporciona una API de sockets BSD al igual que Cygwin. Si tiene MSYS, sólo debe ser capaz de compilar el código como el siguiente:

gcc -c -o test.o test.c -I/include 

se necesita la -I/include para forzar al compilador que busque en la MSYS incluyen directorio.

y enlace de esta manera:

gcc -o test.exe test.o /bin/msys-1.0.dll