Red de conocimiento informático - Problemas con los teléfonos móviles - He cerrado el socket VC 9903. ¿Por qué la próxima vez que cree este socket, el número asignado sigue siendo 9903 y todavía hay datos en él?

He cerrado el socket VC 9903. ¿Por qué la próxima vez que cree este socket, el número asignado sigue siendo 9903 y todavía hay datos en él?

1. Espero continuar reutilizando el socket después de cerrar el socket (generalmente no se cierra inmediatamente, sino después del proceso TIME_WAIT):

y BOOL bReuseaddr = TRUE

Use setsockopt (s, SOL_SOCKET, SO_REUSEADDR (para const char *) & bReuseaddr size (BOOL));

2. Un SOKET que ya está en un estado de conexión forzada no experimentará TIME_WAIT al llamar a closesocket.

BOOL bDontLinger = FALSE;

p>Utilice setsockopt(s, SOL_SOCKET, SO_DONTLINGER, (para const char *) & bDontLinger en sizeof(BOOL));

Durante el proceso de envío () y recepción (), a veces debido a las condiciones de la red y otras razones, no se puede esperar el envío y la recepción

,

Interpretación nNetTimeout = 1000; // segundos

//Límite de tiempo de envío

Usa setsockopt (socket, SOL_S0CKET, SO_SNDTIMEO (char *) nNetTimeout, es sizeof();

Enviar( ), proceso recv (), a veces debido a las condiciones de la red y otras razones, no se puede esperar el envío y la recepción.

int));

// límite de tiempo de recepción usando setsockopt (socket, SOL_S0CKET SO_RCVTIMEO, (CHAR *) nNetTimeout, es sizeof (int)); enviando Bytes (sincrónicos) o Bytes/(asincrónicos) enviados al búfer del socket de forma predeterminada, el sistema envía y recibe 8688 bytes (aproximadamente 8,5 K), en el proceso de envío de datos.

Se puede configurar mayor que los datos en el búfer del socket para evitar que el transceptor haga un bucle constante al enviar (), RECV ():

//Recibir búfer

Interpretación nRecvBuf = 32 * 1024 ;/ / Establecer 32K

Utilice setsockopt (s, SOL_SOCKET, SO_RCVBUF, (para const char * ) nRecvBuf, es sizeof (int));

//Enviar área de búfer

Interpretación nSendBuf = 32 * 1024;

Utilice setsockopt(, SOL_SOCKET en SO_SNDBUF, (para const char *) nSendBuf, es sizeof (int)); no quieren pasar por una copia del búfer del socket en el búfer del sistema

El programa afectará el rendimiento:

Interprete nZero = 0 BR /> use setsockopt (socket; , SOL_S0CKET SO_SNDBUF, (CHAR *) nZero sizeof(nZero));

Ibid. arriba (de forma predeterminada, el contenido del búfer del socket se copia en el área del búfer del sistema):

interpreta nZero = 0;

función setsockopt (socket SO_RCVBUF SOL_S0CKET, (CHAR *) nZero como sizeof(int)); que el socket tiene la función de enviar datos por difusión:

BOOL bBroadcast = TRUE

Utilice socketsockopt (SOL_SOCKET, SO_BROADCAST, (S, para const char *) &bBroadcast en sizeof (int ));

Utilice socketsockopt (SOL_SOCKET, SO_BROADCAST, (S, para const char *) &bBroadcast en sizeof (BOOL));

8 Conéctese al cliente durante el proceso del servidor. , si su socket está en modo sin bloqueo, establezca el retraso de conexión () en el proceso de conexión ()

hasta que se llame a accpet () (esta función solo juega un papel sin bloqueo significativo en este proceso). rol

, llamado en funciones de bloqueo)

BOOL bConditionalAccept = TRUE;

Utilice setsockopt (s, en SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (para const char *) & bConditionalAccept, tamaño de (BOOL));

Aquí

En este proceso, los datos se envían primero (el método send () aún no se ha completado, no se envían datos), luego se cierra el socket () y luego generalmente adoptamos un apagado "acomodado" (S, SD_BOTH) mide, pero los datos definitivamente se perderán. ¿Cómo configurar el programa en una aplicación específica para cumplir con los requisitos de

estructura inquietante {

u_short l_onoff;

u_short l_linger

inquietante m_sLinger

m_sLinger.l_onoff = 1 ;/ / (Cuando se llama a closesocket close(), pero mientras permanezca allí, los datos no se enviarán después)

//. Si m_sLinger.l_onoff = 0, los datos no se enviarán posteriormente. Si m_sLinger.l_onoff = 0, la función funciona igual que 2);

m_sLinger.l_linger = 5;/ / (se permite permanecer allí durante 5 segundos)

función setsockopt ( , SOL_SOCKET, SO_LINGER, (para const char *) & m_sLinger en sizeof (linger));