2011-01-09 21 views
19

He estado tratando de escribir un servidor en C++ estilo Unix, pero estoy atascado en una máquina con Windows. Empecé con MinGW, pero no se compiló correctamente y me dijo que no podía encontrar el archivo "sys/socket.h". Lo cual, por supuesto, es necesario para que el servidor funcione. Fui a buscarlo, y creo que en algún lugar me dijeron que instalara Cygwin, ya que viene con muchas bibliotecas. De acuerdo, entonces lo instalé. Cada biblioteca que podría ofrecerme. Luego fui a compilar de nuevo, y TODAVÍA no puedo encontrarlo. Fui a buscar en la carpeta TODO lo incluye, y no pude encontrar el archivo. Así que estaba un poco molesto (3 horas por el desagüe para una funcionalidad adicional que no necesito), pero continué buscando. No puedo encontrarlo por ninguna parte. Encuentro varias referencias para usarlo, pero no puedo encontrar DONDEQUIERA para descargarlo. He estado buscando las últimas horas y me he sentido muy frustrado con todo porque NO HAY referencias sobre dónde puedo conseguirlo (y NO usaré winsock. Eso rompe la compatibilidad si mal no recuerdo).¿Dónde se obtiene el archivo de encabezado/fuente "sys/socket.h"?

Por lo tanto, en pocas palabras, ¿dónde puedo descargar los archivos 'socket.h'/'socket.c'/'socket.cpp'? Haría mi vida (y estoy seguro de la vida de muchos otros) ¡MUCHO más fácil, y realmente lo apreciaría!

+1

Cygwin tiene la mayoría de los encabezados POSIX, incluido sys/socket.h. Es extraño que no lo hayas encontrado. Mi instalación de Cygwin ciertamente lo tiene. –

+1

@Sergey, puede haber instalado MinGW directamente, sin instalarlo a través de Cygwin. –

+0

¿Lo necesitas? Windows define una API casi idéntica que puede usar en su lugar. Y si necesita portabilidad multiplataforma, las bibliotecas como Boost.Asio o ACE podrían ser mejores opciones. – jalf

Respuesta

10

Dado que ha etiquetado la pregunta C++, puede interesarle usar boost::asio, ACE, o alguna otra biblioteca de socket multiplataforma para C++ o C. Algunas otras bibliotecas multiplataforma se pueden encontrar en las respuestas a C++ sockets library for cross-platform y Cross platform Networking API.

Suponiendo que el uso de una biblioteca de sockets multiplataforma tercero no es una opción para usted ...

<sys/socket.h> La cabecera se define en la norma IEEE Std. 1003.1 (POSIX), pero lamentablemente Windows no cumple con el estándar POSIX. El compilador MinGW es un puerto de GCC para compilar aplicaciones de Windows y, por lo tanto, no incluye estos encabezados de sistema POSIX. Si instala GCC usando Cygwin, incluirá estos encabezados de sistema para emular un entorno POSIX en Windows. Tenga en cuenta, sin embargo, que si utiliza Cygwin para sockets que a) tendrá que colocar el archivo DLL de cygwin en un lugar donde su aplicación pueda leerlo yb). Los encabezados de Cygwin y los encabezados de Windows no interactúan muy bien (por lo tanto, si planea incluir windows.h, entonces probablemente no desee incluir sys/socket.h).

Mi recomendación personal sería descargar una copia de VirtualBox, download a copy of Ubuntu, instalar Ubuntu en VirtualBox, y luego hacer su codificación y pruebas en Ubuntu. Alternativamente, me dicen que Microsoft vende un "subsistema UNIX" y que está preinstalado en ciertas ediciones de Windows de gama alta, aunque no tengo idea de cuán compatible es este sistema (y, si es compatible, con qué edición del estándar UNIX es compatible). Winsockets también son una opción, aunque pueden comportarse de maneras sutilmente diferentes a sus contrapartidas de POSIX, aunque las firmas pueden ser similares.

+2

El subsistema al que se refiere se llama [Interix] (http://en.wikipedia.org/wiki/Interix) +1 –

+1

@BillyONeal, la página wiki sugiere que, * Microsoft anunció en 2011 que Interix no será incluido en las versiones de Windows posteriores a Windows 8 y los clientes deberían comenzar a migrar sus aplicaciones a una solución alternativa. * – iammilind

+0

@iammilind ¿notaron algo acerca de la fecha de ese comentario? :) –

27

Dado que Windows no tiene sys/socket.h, es posible considerar simplemente hacer algo como esto:

#ifdef __WIN32__ 
# include <winsock2.h> 
#else 
# include <sys/socket.h> 
#endif 

Sé que usted indicó que no usará WinSock, pero desde WinSock es cómo las redes TCP se hace en Windows, no veo que tengas otra alternativa. Incluso si usa una biblioteca de redes multiplataforma, esa biblioteca llamará a WinSock internamente. La mayoría de las llamadas API estándar de sockets BSD se implementan en WinSock, por lo que con un poco de prudencia, puede hacer la misma compilación de programas basados ​​en sockets tanto en Windows como en otros sistemas operativos. Simplemente no olvide hacer un

#ifdef __WIN32__ 
    WORD versionWanted = MAKEWORD(1, 1); 
    WSADATA wsaData; 
    WSAStartup(versionWanted, &wsaData); 
#endif 

en la parte superior de main() ...de lo contrario, todas las llamadas al socket fallarán en Windows, porque el subsistema WSA no se inicializó para su proceso.

+0

¿No necesita la versión de Windows del zócalo de cierre también? ¿Y un par de otras cosas más? – Pacerier

+0

Sí, bajo Windows necesita llamar a closesocket() en lugar de cerrar(). Y probablemente también otras cosas. –

0

me gustaría simplemente añadir que si desea utilizar ventanas biblioteca de conexión de la que tiene que:

  • al principio: llamar WSAStartup()

  • al final: llamar WSACleanup ()

Saludos;

0

Intente reinstalar cygwin con el paquete seleccionado: gcc-g ++: compilación del compilador gnu C++ (de la categoría de desarrollo), servidor openssh y programa cliente (neto), make: la versión gnu (desarrollo), terminal ncurses (utils), editores vim mejorados (editores), una implementación de lisp común de ANSI (matemática) y libncurses-devel (lib).

archivos

Esta biblioteca debe estar bajo cygwin \ usr \ incluir

Saludos.

Cuestiones relacionadas