la configuración de tiempo de espera TCP

  Cuando el aprendizaje de los valores de TCP de tiempo de espera y no encontró ningún tiempo de espera completa presentación en línea, y luego resumir. TCP tiempo de espera en total dividida en tres categorías: ConnectTimeout, writeTimeout, ReadTimeout (tiempo de espera de conexión, tiempo de espera de leer, escribir la interrupción). A continuación se describe cómo configurar estos tres tiempos de espera.

1. Conexión Tiempo de espera agotado

  Cuando TCP función de conexión de llamada, el TCP de 3 vías apretón de manos para establecer la necesidad, después de SYS señal enviada desde el cliente para esperar el inicio, el tiempo de espera falla la conexión, ya no esperar función de conexión, el retorno directo. Este tiempo se denomina tiempo de espera. Tiempo de espera es el límite máximo del sistema a sistema Linux, por ejemplo, invocar el comando: sysctl net.ipv4.tcp_syn_retries pueden ver las configuraciones del sistema máxima ConnectTimeout. Devuelve:

4: tiempo de espera es 31s

5: tiempo de espera es 75s

6: tiempo de espera es 127S

Pero a veces queremos establecer su propio tiempo ConnectTimeout (Nota: Este tiempo de espera debe ser más corta que la hora del sistema, de lo contrario el sistema se corta en el tiempo de espera del sistema).

1.1 Función de alarma

Al configurar la función de alarma de tiempo de espera se puede utilizar, de la siguiente manera:

// manipulador de tiempo de espera de 
vacío alarm_handler ( int SIG) 
{ 
    printf ( " Conectar tiempo de espera " );
     retorno ; 
} 

int main () 
{ 
    ... 
    Señal (SIGALRM, alarm_handler) 
    Alarma ( 5. ); // Conjunto de las 5S tiempo de espera 
    int RC connect = (...); // llamar a la función de conexión 
    de alarma ( 0 );
     IF (RC < 0 ) {
         IF (errno == EINTR) {
             // tiempo de espera de conexión 
      }  
    }
}

Este enfoque puede tener los defectos siguientes:

(1) Algunos del sistema operativo UNIX después de las declaraciones de manejador de señales pueden reiniciar las llamadas de conexión;

(2) Si se conecta correctamente, pero esta vez el temporizador de la alarma se ha terminado, esta vez será todavía ser terminado el programa.

1.2 utilizar la función de selección

Utilice la función de selección, observar si se produce una toma de cambio de lectura o escritura naturaleza (de hecho por escrito para monitorear los cambios en la naturaleza de la línea, porque una vez que la conexión se realiza correctamente, la toma debe ser modificable). Véase el siguiente pseudo-código:

. 1  int main ()
 2  {
 3.      Int calcetín; 
 . 4      
5.      Calcetín = socket (AF_INET, SOCK_STREAM, 0 ); // 1. socket llamada de función
 6.      
7.      // 2. El calcetín se proporciona sin bloqueo
 8.      
9.      // Invoke Conectar la función 
10      int RC = connect (nuestro calcetín, ...); 
 . 11      / * *********************************************************
 12 es      la función de conexión de llamada, siempre que no bloqueante, habrá tres típica donde:
 13 es      1. RC = 0, una conexión exitosa
 14      ! 2. errno = RC = 0 && EINPROCRESS, descripción no se ha conectado con éxito
 15      3. RC errno = 0 && EINPROCRESS, fallo de conexión !!
 16     ******************************************************** * / 
17.      IF (RC == 0 ) {
 18 está          conectado correctamente, el calcetín se proporciona al bloque;
 19          realiza programa de cliente subsiguiente;
 20 es      }
 21 es      la más  IF (! RC = 0 ! = && error EINPROCRESS)
 22 está          conectado falla, el retorno directo;
 23 es      el más {
 24          la fd_set rdevent, wrevent, exevent; // esto sólo puede evento de escritura detecta, es decir wrevent 
25          FD_ZERO (y rdevent);
 26 es          el fD_SET ( nuestro calcetín, y rdevent);
 27          WR = rdevent;
 28          exevent = rdevent;  // establece el monitor leer y escribir y supervisión de excepciones del monitor 
29          = tv.tv_sec 5. ;
 30          tv.tv_usecc = 0 ; // establecer las 5s de tiempo de espera, esta sección puede buscar el método de operación relacionada usando la función de selección 
31 es          RC = seleccionar ( nuestro calcetín + . 1 , y rdevent, y wrevent, y exevent, y TV);
 32          IF (RC < 0 )
 33 es              errores función de selección;
 34 es          el otro  IF (RC == 0 )
 35              veces función de selección de fuera, es decir, la conexión de tiempo de espera ConnectTimeout
 36          la otra cosa {    // hay monitoreo retornos de señal
 37              // detectaron en este momento si la conexión es exitosa 
38             SI (!! FD_ISSET (nuestro calcetín, y rdevent) && FD_ISSET (nuestro calcetín, y wrevent))   // ni leer, ni escribir, debe ser un error de conexión 
39              int ERR;
 40              int len = sizeof (ERR);
 41 es              SI (getsockopt ( calcetín, SOL_SOCKET, la SO_ERROR, y ERR, y lEN) < 0 )
 42 está                  llamando a un getsockopt () la función de error en sí;
 43 es              SI ! (ERR = 0 ) 
 44 se                  describen las salidas de error de conexión;
 45              el otro 
46 está                  conectado correctamente, establecen el calcetín para inicio del bloque el controlador de cliente;
 47          }
 48      }
 49 }

  Hay dos juicio más crítico, en primer lugar, la llamada connect () Hay tres posibles situaciones después de las mismas, véase más arriba líneas 12-15, en segundo lugar slelect cambio de propiedad detectada, llama a una función getsockopt (), si se devuelve el error err = 0, Descripción Sí, se establece la conexión, o la conexión no se ha establecido, ver 41-46 líneas anteriores.

Nota: Si después de la función conenct falla, la llamada puede funcionar sin conexión inmediatamente de nuevo, primero debe cerca de la toma de corriente.

 

2. writeTimeout y tiempo de espera ReadTimeout

 

Supongo que te gusta

Origin www.cnblogs.com/yuanwebpage/p/12443825.html
Recomendado
Clasificación