La diferencia entre la programación de Windows Socket y Linux Socket
El SOCKET debería ser el mismo en principio, pero los mecanismos operativos de diferentes sistemas son algo diferentes.
Problemas encontrados al portar la programación de Socket de Windows al código de Linux
1. Portar algunas funciones comunes
2 Red de socket
Cosas a las que debe prestar atención al trasplantar programas relacionados de Windows a Linux
1) Archivo de encabezado
winsock.h/winsock2.h en Windows
sys /socket en Linux .h
Manejo de errores: errno.h
Los archivos de encabezado de otras funciones de uso común se pueden consultar en la línea de comando usando el comando man.
2) Inicialización
WSAStartup es necesario en Windows
No es necesario en Linux (muy conveniente), puedes usarlo directamente
3) Cerrar socket
closesocket(...) en Windows
cerrar(...) en Linux
4) Tipo
windows SOCKET
Es de tipo int en Linux
5) La estructura de la dirección de enlace
tiene el mismo nombre, tanto struct sockaddr como struct sockaddr_in. generalmente se convierten;
En Windows, los nombres están todos en mayúsculas, pero en Linux, están en minúsculas
Usado comúnmente:
Linux:
sockaddr_in destAddr;
destAdd.sin_family=AF_INET;
destAddr.sin_port=htons(2030);
destAddr.sin_addr.s_addr=inet_addr( " 192.168.1.1");
En Windows:
SOCKADDR_IN destAddr;
destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1")
Pero los nombres de los miembros en la estructura son diferentes
Miembros estructurales en Windows
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
struct in_addr {
unión {
estructura { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
estructura { u_short s_w1,s_w2 } S_un_w;
u_long; S_addr;
} S_un;
};
Las siguientes macros pueden portar programas de Windows a Linux (mediante la redefinición de tipos, el código tiene características de Linux) y portabilidad bajo Windows)
[cpp] ver copia simple
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t ; p>
#endif
#ifdef __LINUX__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif
[cpp] ver copia simple p>
#
ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif
#ifdef __LINUX__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR ( -1)
#endif
6) Obtener el código de error
getlasterror()/WSAGetLastError() en Windows
errno en Variables de Linux
7) Establecer sin bloqueo
ioctlsocket() en Windows
fcntl() en Linux
8) El último parámetro de la función de envío
Generalmente está configurado en 0 en Windows.
Es mejor configurarlo en MSG_NOSIGNAL en Linux. Si no está configurado, es posible. hacer que el programa se cierre después de un error de envío.
9) Adquisición en milisegundos
GetTickCount() en Windows
gettimeofday() en Linux
10) Conversión de algunos tipos de datos
General:
Conversión de little endian a big endian (utilizada por protocolos de red): htonl, htons
Entre IP decimal con puntos y entero Conversión mutua: inet_addr( ) (esta función convierte decimales con puntos a enteros), inet_aton(), inet_ntoa(), inet_pton() (esta función es única en Linux y puede realizar conversiones mutuas)
Los archivos de encabezado utilizados son diferentes. el comando man para consultar en Linux.
Tenga en cuenta también:
El socket utilizado en Linux es un socket Berkeley, por lo que existen diferencias en el uso de la función select() (la configuración del primer parámetro <); /p>
Para hacer coincidir el socket Berkeley en Windows, el primer parámetro es indiferente y generalmente se puede establecer en 0
int maxfdp es un valor entero, que se refiere a todos los archivos en el; colección ¡El rango de descriptores, es decir, el valor máximo de todos los descriptores de archivos más 1, no puede estar equivocado!
3. Subprocesos múltiples
Subprocesos múltiples: (win)process.h --> (linux)pthread.h
_beginthread --> pthread_create
p>
_endthread --> pthread_exit