Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Qué tamaño de búfer se necesita para enviar datos grandes de 5 m a través de TCP?

¿Qué tamaño de búfer se necesita para enviar datos grandes de 5 m a través de TCP?

La función de envío de Socket informará un error EAGAIN cuando se ejecute

Cuando el cliente envía un paquete de datos grande a través de la función de envío proporcionada por Socket, se puede devolver un error EGGAIN. tcp_sendspace define la cantidad de datos que una aplicación puede almacenar en caché en el kernel antes de llamar a enviar. Cuando una aplicación establece el atributo O_NDELAY u O_NONBLOCK en un socket, el envío devolverá un error EAGAIN si el búfer de envío está lleno.

Para eliminar este error, existen tres métodos:

1. Expanda tcp_sendspace para que sea mayor que el parámetro de tamaño en enviar

---no. -p - o tcp_sendspace=65536

2 Antes de llamar a enviar, establezca el valor SNDBUF de SNDBUF en la función sockopt. Valor predeterminado del búfer de envío/recepción tcp

[root@qljt core]# cat /proc/sys/net/ ipv4/tcp_rmem

4096 87380 4161536

87380 : Valor predeterminado del búfer de recepción tcp

[root@qljt core]# cat /proc/sys/net/ipv4/tcp_wmem

4096 16384 4161536

16384 : Valor predeterminado del búfer de envío tcp

2.tcp o valor máximo del búfer de envío/recepción udp

[root@qljt core]# cat /proc/sys/net /core/rmem_max

131071

131071: La mitad del valor máximo configurable del buffer de recepción tcp o udp.

Es decir, si rcv_size excede 131071 al llamar a setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);

getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); ser llamado. El valor de RCVBUF, &rcv_size, &optlen); es igual a 131071 * 2 = 262142

[root@qljt core]# cat /proc/sys/net/core/wmem_max

131071

p>

131071: El búfer de envío tcp o udp se puede configurar a la mitad del valor máximo.

Igual que arriba

3.valor predeterminado del búfer de envío/recepción de udp

[root@qljt core]# cat /proc/sys/net/core/ rmem_default

111616: valor predeterminado del búfer de recepción udp

[root @qljt core]# cat /proc/sys/net/core/wmem_default

111616

111616: valor predeterminado del buffer de envío udp

.

El tamaño mínimo del búfer de envío/recepción tcp o udp

El tamaño mínimo del búfer de recepción tcp o udp es 256 bytes, determinado por la macro del núcleo;

envío tcp o udp buffer El valor mínimo es 2048 bytes, determinado por la macro del kernel

setsockopt establece el estado del socket

1. Cierre el socket (generalmente no inmediatamente, pero luego en el proceso TIME_WAIT). close) y luego desea continuar reutilizando el socket:

BOOL bReuseaddr=TRUE;

setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL) ) ;

2. Para forzar el cierre del socket conectado después de llamar a closesocket sin pasar por el proceso TIME_WAIT:

BOOL bDontLinger = FALSE;

setsockopt(s ,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

3 Durante el proceso de envío () y recepción () () (), a veces debido a condiciones de la red, etc. Motivo, no se puede cambiar el tamaño del envío y la recepción, sizeof(int));

/Tiempo de espera de recepción

setsockopt(socket, SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int. ));

4. En send(), lo que se devuelve son los bytes realmente enviados (sincrónicos) o los bytes enviados al búfer del socket (asincrónicos). De forma predeterminada, el sistema envía y recibe 8688 bytes; (aproximadamente 8,5 K) a la vez; en el proceso de enviar datos

y recibir una gran cantidad de datos, puede configurar un búfer de socket para evitar send() y recv() en bucles continuos de envío y recibiendo: