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

La diferencia entre la programación de sockets en Windows y Linux

Lo siguiente se divide aproximadamente en varios aspectos:

Linux debe incluir

[cpp]

#include

#include

#include

#include

y otros archivos de encabezado, mientras que en Windows incluyen

[cpp]

#include

El socket en Linux es Shaping, un SOCKET en Windows.

Cierre el socket en Linux y cierre el socket en Windows.

Hay una variable socklen_t en Linux y es directamente int en Windows.

Debido a que el socket en Linux es el mismo que el fd normal, puede usar lectura y escritura directamente al enviar y recibir datos en el socket TCP. Windows solo puede usar recv y enviar.

Establezca opciones de socket, como configurar el socket para que no sea bloqueante. En Linux

[cpp]

flag = fcntl (fd, F_GETFL);

fcntl (fd, F_SETFL, flag | O_NONBLOCK);

, en Windows es

[cpp]

flag = 1;

ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

Cuando una conexión TCP de socket sin bloqueo está en progreso, el número de error para Linux es EINPROGRESS y el número de error para Windows es WSAEWOULDBLOCK.

archivo

En Linux, la nueva línea del archivo es "\n", mientras que en Windows es "\r\n".

En Linux, el separador de directorios es "/", mientras que en Windows es "\".

Tanto en Linux como en Windows, puede utilizar llamadas de estadísticas para consultar información de archivos. Sin embargo, Linux sólo admite el tamaño 2G, mientras que Windows sólo admite el tamaño 4G. Para admitir consultas de archivos más grandes, puede agregar la definición

_FILE_OFFSET_BITS=64 en el entorno Linux y usar _stat64 para llamar en Windows, y el parámetro de entrada es la estructura __stat64.

En Linux, el tipo de archivo se puede determinar en función del st_mode de stat. Hay macros como S_ISREG y S_ISDIR. No existe tal macro en Windows. Debe definir la macro correspondiente usted mismo, como

[cpp]

#define S_ISREG(m) (((m) & 0170000). == (0100000))

#define S_ISDIR(m) (((m) & 0170000) == (0040000))

Eliminar un archivo en Linux es desvincularlo, y en Linux Windows es DeleteFile.

tiempo

En Linux, la estructura time_t es un número entero largo. En Windows, la estructura time_t es un entero de 64 bits. Si desea que time_t sea un entero sin signo de 32 bits en Windows, puede agregar una definición de macro, _USE_32BIT_TIME_T.

En Linux, la unidad de suspensión son los segundos.

En Windows, la unidad de suspensión es milisegundos. Es decir, se requiere suspensión (1) en Linux y suspensión (1000) en el entorno de Windows.

La macro timecmp en Windows no admite mayor o igual o menor o igual.

No existe una macro de suma y resta de la estructura struct timeval en Windows y debe definirse manualmente:

[cpp]

#define MICROSECONDS ( 1000 * 1000)

#define timeradd(t1, t2, t3) do { \

(t3)->tv_sec = (t1)->tv_sec + (t2)-> tv_sec; \

(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; = (t1)->tv_usec + (t2)->tv_usec % MICROSEGUNDOS; \

if ((t1)->tv_usec + (t2)-> tv_usec > MICROSEGUNDOS) (t3)->tv_sec + +; \

} mientras (0)

#define timersub(t1, t2, t3) hacer { \

(t3)->tv_sec = ( t1)->tv_sec - (t2)->tv_sec; \

(t3)->tv_usec = (t1)->tv_usec - (t2)- >tv_usec ​​\

<; p>if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += MICROSEGUNDOS; \

} mientras ( 0)

Proceso de llamada

En Linux, puede utilizar el sistema directamente para llamar a programas externos. Es mejor usar WinExec para Windows, porque WinExec puede permitir abrir u ocultar la ventana del programa. Especifíquelo con el segundo parámetro de entrada de WinExec, como

SW_SHOW/SW_HIDE.

Varios

Linux son las funciones srandom y aleatorias, Windows son las funciones srand y rand.

Linux es snprintf, Windows es _snprintf.

Del mismo modo, strcasecmp en Linux es _stricmp en Windows.

Manejo de errores

En Linux, la variable global errno generalmente se usa para representar el número de error de ejecución de la función. En Windows, utilice la llamada GetLastError () para obtenerlo.

Estas funciones o macros sólo están disponibles en el entorno Linux.

Estas funciones o macros no están disponibles en Windows y requieren que los usuarios las implementen manualmente.

atolón

[cpp]

largo largo

atolón (const char *p)

{

int menos = 0;

valor largo largo = 0;

if (*p == '-')

{

menos ++;

p ++;

}

mientras (*p >= '0' && *p <= '9')

{

valor *= 10;

valor += *p - '0';

p + +;

}

retorno menos 0 - valor: valor;

}

gettimeofday

[ cpp]

#si está definido(_MSC_VER) || definido(_MSC_EXTENSIONS)

#define EPOCHFILETIME 11644473600000000Ui64

#else

#define EPOCHFILETIME 11644473600000000ULL

#endif

struct timezone

{

int tz_minutoswest;

int tz_dsttime; p>

};

int

gettimeofday (struct timeval *tv, struct timezone *tz)

{

FILETIME ft;

LARGE_INTEGER li;

__int64 t;

static int tzflag;

if (tv)

{

GetSystemTimeAsFileTime (&ft);

li.LowPart = ft.dwLowDateTime;

li.HighPart = ft.dwHighDateTime;

t = li.QuadPart; /* En intervalos de 100 nanosegundos */

t -= EPOCHFILETIME; /* Desplazamiento al tiempo de época */

t /= 10 ; / *En microsegundos*/

tv->tv_sec = (long) (t/1000000);

tv->tv_usec = (long) (t % 1000000);

}

si (tz)

{

si (!tzflag)

{

_tzset ();

tzflag++;

}

tz->tz_minutoswest = _timezone / 60;

tz-> tz_dsttime = _daylight;

}

return 0;

}

Relacionado con la compilación

Función actual, Linux usa _ _FUNCTION__ significa que Windows usa __func__.

------------------------------------------- ----- -------------------------------------

Enchufe programación de código de Windows a Linux Problemas encontrados en el trasplante

1) Archivo de encabezado

winsock.h/winsock2.h en Windows

sys/socket.h en Linux

Manejo de errores: errno.h

2) Inicialización

WSAStartup es necesario en Windows

No es necesario en Linux

3 )Cerrar socket

cerrar socket(...) en Windows

cerrar(...) en Linux

4) Tipo

SOCKET en Windows

int en Linux

Por ejemplo, algunas macros que uso:

#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

5) Obtener el código de error

getlasterror()/WSAGetLastError() en Windows

variable errno en Linux

6 ) Establecer sin bloqueo

ioctlsocket() en Windows

fcntl() en Linux

7) El último parámetro de la función de envío

Windows Generalmente está configurado en 0

Es mejor configurarlo en MSG_NOSIGNAL en Linux. Si no está configurado, el programa puede cerrarse después de un error de envío.

8) Adquisición en milisegundos

GetTickCount() en Windows

gettimeofday() en Linux

3 Subprocesos múltiples p>

Subprocesos múltiples: (win)process.h --> (linux)pthread.h

_beginthread --> pthread_create

_endthread --> pthread_exit

------------------------------------------- ------ ------------------

Los sockets utilizados por las plataformas Windows y Linux se heredan del socket Berkeley (rfc3493), y todos admiten el modelo de E/S seleccionado y todos admiten el uso de getaddrinfo y getnameinfo para implementar programación independiente del protocolo. Pero existen diferencias sutiles,

incluyen principalmente:

Archivos de encabezado y bibliotecas de clases. Windows usa winsock2.h (debe incluirse antes de windows.h) y los enlaces a la biblioteca ws2_32.lib; Linux usa netinet/in.h, netdb.h, etc.

En Windows, WSAStartup y WSAClean deben usarse antes y después de usar socket.

Cerrar el socket. Windows usa closesocket y Linux usa close.

El tipo de longitud del socket de los parámetros de las funciones send* y recv* es int en Windows y socklen_t en Linux. Esta diferencia se puede manejar en la instrucción de precompilación. Cuando la plataforma es Windows, #define socklen_t. int sin firmar.

El primer parámetro de la función de selección. Windows ignora este parámetro. En Linux, este parámetro representa el límite superior del socket en la colección. Generalmente se establece en sockfd (el socket que debe seleccionarse). ) + 1.

El tipo de valor de retorno de la función de socket en Windows es SOCKET (unsigned int) y se devuelve INVALID_SOCKET (0) cuando ocurre un error. El tipo de valor de retorno de la función de socket en Linux es int. -1 se devuelve cuando ocurre un error.

Además, si la dirección de loopback local está vinculada, la función sendto en Windows puede pasar, pero la función sendto en Linux devuelve un error: errno=22, argumento no válido. Generalmente, las direcciones comodín están vinculadas.

Reimprimir jlins