¿Cada socket tiene un buffer asignado?

Tiene que asignar un búfer para un socket.

Por lo general, el búfer es solo una matriz estática creada por el usuario y asignada en la memoria de la pila. Considere el siguiente código C para los sockets de Berkeley: Wikipedia, el buffer es una matriz de caracteres con tamaño 1024. El programa usa el buffer para leer los datos recibidos del socket:

calcetín int;
buffer de char [1024];

// Creación y enlace de sockets aquí

para (;;) {
recsize = recvfrom (sock, (void *) buffer, sizeof buffer, 0, (struct sockaddr *) & sa, & fromlen);
if (recsize <0) {
fprintf (stderr, “% s \ n”, strerror (errno));
salir (EXIT_FAILURE);
}
printf (“recsize:% d \ n”, (int) recsize);
dormir (1);
printf (“datos recibidos:%. * s \ n”, (int) recsize, buffer);
}

En lenguajes de nivel superior, su API de socket puede ocultar el proceso de creación del búfer por conveniencia para que no tenga que asignar un búfer, pero el concepto subyacente se mantiene intacto.

Sí, cada socket tiene su propio espacio de almacenamiento intermedio donde se almacena la carga útil de datos.

La memoria para almacenar el búfer se asigna desde el núcleo.

Los datos ingresan al búfer desde la aplicación cuando la aplicación realiza una escritura () o envío (), el núcleo luego transmite esos datos a través de la red. Cuando se recibe tráfico de red, el kernel coloca cualquier carga de datos en el búfer, esos datos dejan el búfer hacia la aplicación cuando la aplicación realiza una lectura () o recv ().