Red de conocimiento informático - Problemas con los teléfonos móviles - La diferencia entre la programación de Windows Socket y Linux Socket

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 ;

#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

#

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