Pregunta

Estoy a punto de desarrollar algunos zócalos relacionado cosas en C++ y quisiera que el software sea tan portátil entre Windows y Linux como sea posible desde el principio (lo que es portátil más tarde es difícil.)

He mirado en diferentes bibliotecas, hay uno para C++ de alhem.net y, por supuesto, hay boost::asio.boost::asio se ve muy prometedor, pero sería una gran dependencia de las aplicaciones de este pequeño.

Es que incluso la pena escribir las cosas que a mí mismo o debo usar una biblioteca?Si puedo hacerlo yo mismo, ¿qué sería de los principales escollos?

¿Fue útil?

Solución

Winsocks no son muy compatibles con Posix sockets:

  • En Winsocks un socket es de tipo SOCKET.En Posix es simplemente un descriptor de archivo (int), en el que puede realizar normales read() y write() las llamadas.
  • No devolver errores de la misma manera.
  • No apoyo a algunas de las opciones en recv() y send().
  • Usted tiene que inicializar y unitialize la biblioteca Winsocks con dos funciones especiales.
  • No creo que se puede cerrar de Windows sockets con shutdown() o close().Es algo así como closesocket() en su lugar.

Debe haber más diferencias, pero eso es lo que recuerdo ahora mismo.Si quieres portabilidad con Winsocks, usted tendrá una pequeña biblioteca para cerrar un socket, imprimir un mensaje de error y así sucesivamente.

Probablemente me vaya con boost::asio, personalmente (nunca lo he utilizado, aunque).

Otros consejos

He desarrollado un par de portátiles de contenedores alrededor de sockets.Asegúrese de que no vaya a la mierda carril de no retorno que está constituido de WinSock2 eventos.Aparte de eso, como yo lo veo, las mayores diferencias son:

  • para iniciar el trabajo en red en Windows, usted necesita llamar a ::WSAStartup(), para apagarlo en Windows, ejecute ::WSACleanup();en Linux no hacer nada,
  • close() en Linux es closesocket() en Windows,
  • por defecto el tamaño del buffer difieren entre ambos controladores y sistemas operativos, así que asegúrese de establecer con ellos usando SO_RCVBUF y SO_SNDBUF,
  • SO_REUSEADDR roba la dirección en Windows, permite a los frecuentes re-apertura en Linux;probablemente sólo desea utilizar este indicador en Linux,
  • haciendo un socket que no sea el bloqueo de usa ::ioctlsocket() en Windows, ::fcntl() en Linux,
  • los archivos de encabezado son diferentes, <sys/socket.h> y amigos en Linux, <WinSock.h> en Windows,
  • para ir portátil, la forma más sencilla es probablemente el uso de ::select() a la espera de los datos para llegar,
  • fd_sets son totalmente diferentes en Windows/Linux;esto sólo es relevante si usted necesita para optimizar la inicialización de fd_sets, tales como cuando la adición/eliminación de conexiones arbitrarias,
  • en Windows, cualquier hilo que cuelga en el socket, es publicado con un código de error cuando el conector está cerrado, en Linux el hilo permanece a la espera.Si el hilo está bloqueando el zócalo, por ejemplo, con ::recvfrom(), usted podría considerar el uso de ::sendto() para liberar el bloqueo de rosca bajo Linux.

Todo lo demás que he necesarios sólo trabajaba fuera de la låda.

Eche un vistazo a " Adaptive Communications Environment " (ACE) biblioteca: (Página de inicio de ACE) Proporciona algunas buenas abstracciones y mucha flexibilidad, todo en una biblioteca portátil que admite Windows, MacOS y Linux. Tiene una curva de aprendizaje un poco pronunciada, pero obtuve muy buen valor de ella.

¿Cuántas cosas de socket usarás? He hecho varias aplicaciones donde el material del socket era de un nivel bastante alto (abrir, leer, escribir), y funcionó perfectamente desde Windows a Linux. Si es más que eso, ve con impulso.

Honestamente, usaría boost :: asio como primera preferencia. Si realmente quiere ensuciarse con la API de sockets, puede usar la API de sockets de estilo BSD estándar en Windows y Linux: es solo que en Windows tendrá que vincular (e inicializar) Winsock2, mientras que en Linux no tendrá una biblioteca separada para vincular.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top