Solución al problema de que la dirección IP obtenida por la función aceptar en Winsock es siempre 204.204.204.204 o 0xcccccccc

Causa del problema

El código donde tengo el problema es el siguiente:

SOCKADDR_IN clientAddr;
acceptSocket = accept(ProxyServer, (SOCKADDR*)&clientAddr, NULL);
printf("客户端IP为:%s", inet_ntoa(clientAddr.sin_addr));//输出204.204.204.204

acceptTengo este problema con las funciones aquí . De hecho getpeername, si tienes problemas con el uso de otras funciones, deberían ser similares. Si no me crees, sigue leyendo:).

Tan pronto como se mostró el código, el maestro pudo ver el problema de un vistazo, pero me tomó media hora. ¡Creo que los amigos que hicieron clic también tienen problemas similares!

Primero explique por qué es 204.204.204.204así o 0xcccccccc:

204 convertido a hexadecimal es 0xcc, que son los datos utilizados cuando vc inicializa la pila.

Entonces, si aparece , significa que los datos no están escritos correctamente en la variable del tipo 204.204.204.204que especificamos .SOCKADDR_IN

solución

accept¡ El tercer parámetro de la función requiere que escribamos el tamaño del segundo parámetro ! ¡ Pero el código en cuestión está usadoNULL ! Si no lo cree, ¡eche un vistazo a la segunda línea de código de arriba!

(PD. Este es uno de nuestros experimentos. El profesor nos dio un código de ejemplo. El segundo y tercer parámetro predeterminados son los mismos NULL, pero necesitamos modificarlos para agregar nuevas funciones. ¡¡Pero soy un novato otra vez!! Acabo de cambiar el segundo parámetro, pero olvidé cambiar el tercer parámetro!!!)

La solución también es muy sencilla, solo dale el tercer parámetro (risas)

Utilice getpeernamela función de espera para solucionar el problema. La solución es la misma, ¡ 大小solo especifique los parámetros!

Entonces el resultado corregido del código anterior es el siguiente:

SOCKADDR_IN clientAddr;
int sockaddr_in_size = sizeof(SOCKADDR_IN);//给定第三个参数
acceptSocket = accept(ProxyServer, (SOCKADDR*)&clientAddr, &sockaddr_in_size);//把第三个参数传进去
printf("客户端IP为:%s", inet_ntoa(clientAddr.sin_addr));

Link de referencia

[1] https://blog.csdn.net/wu_lai_314/article/details/8374905
[2] https://zhidao.baidu.com/question/569840007.html

Supongo que te gusta

Origin blog.csdn.net/weixin_52027058/article/details/127200464
Recomendado
Clasificación