Red de conocimiento informático - Problemas con los teléfonos móviles - La llamada a recvfrom() sólo puede devolver un paquete UDP. ¿Es esto correcto?

La llamada a recvfrom() sólo puede devolver un paquete UDP. ¿Es esto correcto?

1. La llamada a recvfrom() solo puede devolver un paquete UDP.

2.2. La longitud del buffer en los parámetros de la función send() es limitada, dependiendo de la longitud máxima del paquete de datos del protocolo subyacente. Esta longitud se puede obtener configurando el parámetro SO_MAX_MSG_SIZE de la función getsockopt. Si el paquete enviado excede la longitud máxima del protocolo subyacente, se devolverá un error WSAEMSGSIZE sin enviar ningún dato.

La longitud del búfer en los parámetros de la función sendto() también es limitada, lo cual es más obvio. La longitud de la porción de datos del paquete (excluyendo el encabezado) no puede exceder los 512 bytes.

3. El retorno normal de send() y sendto() no garantiza que el receptor reciba correctamente los datos enviados. Depende de si el búfer está lleno. Tanto recv como recvfrom bloquean y esperan cuando el búfer está vacío (a menos que esté configurado como sin bloqueo, en cuyo caso se devolverá un error WSAEWOULDBLOCK). Por lo tanto, siempre que la conexión del socket sea normal y el búfer tenga contenido de datos, las funciones recv y recvfrom pueden recibir paquetes de datos normalmente, aunque habrá un retraso.

Espero que estés satisfecho con mi respuesta :)

Hola, vi lo que agregaste. La longitud máxima que mencioné anteriormente es 512 bytes, que se refiere a la longitud máxima que puede enviar un paquete UDP. Se dirige a la función sendto y usted utiliza la función de envío en la conexión TCP durante la prueba. Los dos protocolos son diferentes y la longitud del búfer ciertamente es diferente. Probé usando getsockopt y obtuve que el búfer máximo de mi receptor local fue 8192.

# include & ltstdio.h & gt

#Include "winsock2.h"

void main() {

WSADATA wsaData

Socket ListenSocket

servicio sockaddr_in;

int resultado = wsa startup(make word(2, 2), & ampwsa data);

int p>

If (iResult!= NO_ERROR)

printf(" Error al iniciar wsa\n ");

ListenSocket = socket( AF_INET, SOCK_STREAM, IP proto_TCP );

if(listen SOCKET == INVALID _ SOCKET){

printf("Error en el socket ()\ n ");

WSACleanup ();

Regresar;

}

hostent*este host;

char * ip

u _ puerto corto;

puerto = 27015;

este host = gethostbyname(" ");

IP = inet _ ntoa(*(struct in _ addr *)* este host->h_addr_list);

service.sin_family = AF_INET

service.sin_addr.s_addr= inet_addr(IP);

service . sin_port = htons(puerto);

if ( bind( ListenSocket, (SOCKADDR *)& servicio, sizeof(servicio ))= = SOCKET _ ERROR){

printf(" Error de enlace\n ");

cerrar socket(escuchar socket);

Regresar;

}

int optVal

int opt ​​len ​​= sizeof(int);

getsockopt(ListenSocket, SOL_SOCKET, SO_RCVBUF, (char *)&opt val &opt len);

printf("La longitud máxima es %d\n ", opt val);

WSACleanup();

p>

Retorno;

}

Además, el SO_MAX_MSG_SIZE mencionado anteriormente solo es válido para UDP. UDP es un protocolo de datagramas y no es válido para TCP/IP basado en flujo, por lo que aquí se utiliza el parámetro SO_RCVBUF. Si tienes alguna pregunta, por favor indícala :)