En un servidor TCP, select () se invoca una vez por segundo. ¿Cómo puedo diferenciar dos o más paquetes cuando llegan en 1 segundo?

¿Está sondeando cada uno de sus sockets TCP con “select ()” individualmente (lo que me parece increíblemente ineficiente) o está verificando cuáles de sus sockets TCP tienen datos listos configurando la (s) máscara (s) de bits adecuadamente?

En las versiones de select () con las que estoy familiarizado, el parámetro de tiempo de espera le permite esperar valores de milisegundos, aunque lo bien que el núcleo respeta eso es otra cuestión.

Como “select ()” solo le dice que los datos están disponibles, entonces realmente no puede saberlo, especialmente si hay datos no leídos disponibles en varios sockets a la vez.

Tampoco tiene en cuenta cómo se comporta TCP cuando los datos se pierden y se retransmiten.

Si realmente necesita distinguir el orden en que llegan los datos en un socket TCP, probablemente debería usar un modelo de programación con hilos y tener hilos separados para cada socket TCP, o tener un hilo que reempaquete los datos que vienen del Los sockets TCP en algún tipo de estructura de datos adecuada con las marcas de tiempo apropiadas, y esperamos que ese proceso nunca se demore por otro procesamiento.

Realmente no puedo pensar en una manera fácil de hacer esto en un solo socket TCP (flujo) suponiendo que la carga útil de su paquete no incluye una marca de tiempo. Porque select() solo le dice que hay algunos datos listos para leer. Incluso si llama a read() antes de que llegue el siguiente paquete cada vez, no hay garantía de que read() regrese con un solo paquete (debido a los cambios de contexto y el mutex del socket).

Sin embargo, puedo pensar en otra opción. Puede usar un socket RAW en lugar de su socket TCP. O mantenga su socket actual y los paquetes sniff en paralelo usando libpcap.

Supongo que estás preguntando cuál de ellos llegó primero, y que están en dos enchufes diferentes.

Si estuvieran en el mismo zócalo, los leería en el orden en que llegaron.

Desafortunadamente, usando este mecanismo, no podrás saberlo. ¿Está seguro de que desea sondear con select ()? Eso es muy intensivo.

En cualquier caso, ¿por qué estás compitiendo con paquetes?

Estoy llamando a una llamada selectiva del sistema por 1 segundo usando un hilo. Si dos o más paquetes llegan al mismo paquete en un segundo. leer () considerándolo como un paquete. Quiero saber cuántos ha llegado y también leer cada paquete por separado. resuelva el problema no reduciendo ese tiempo “1 segundo”.
Para una mejor utilización de la CPU, estoy usando el proceso anterior.

¿Conoce el tamaño de los datos que llegarán en cada paquete? ¿No puedes leer esos muchos bytes y contarlo como un paquete?