Lösung des Problems, dass die von der Akzeptanzfunktion in Winsock erhaltene IP-Adresse immer 204.204.204.204 oder 0xcccccccc ist

Ursache des Problems

Der Code, bei dem ich das Problem habe, ist wie folgt:

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

acceptIch habe dieses Problem mit den Funktionen hier . getpeernameWenn Sie tatsächlich Probleme mit der Verwendung anderer Funktionen haben, sollten diese ähnlich sein. Wenn Sie mir nicht glauben, lesen Sie weiter: ).

Sobald der Code angezeigt wurde, konnte der Master das Problem vielleicht auf einen Blick erkennen, aber ich brauchte eine halbe Stunde. Ich glaube, Freunde, die sich eingeklickt haben, haben auch ähnliche Probleme!

Erklären Sie zunächst, warum das so ist 204.204.204.204oder 0xcccccccc:

204, konvertiert in Hexadezimalzahl, ist 0xcc. Dies sind die Daten, die verwendet werden, wenn vc den Stapel initialisiert.

Wenn es also erscheint , bedeutet das, dass die Daten nicht korrekt in die Variable des 204.204.204.204von uns angegebenen Typs geschrieben wurden.SOCKADDR_IN

Lösung

acceptFür den dritten Parameter der Funktion müssen wir die Größe des zweiten Parameters schreiben ! Aber der betreffende Code wird verwendetNULL ! Wenn Sie es nicht glauben, werfen Sie einen Blick auf die zweite Codezeile oben!

(PS. Dies ist eines unserer Experimente. Der Lehrer hat uns einen Beispielcode gegeben. Der zweite und dritte Standardparameter sind gleich, NULLaber wir müssen sie ändern, um neue Funktionen hinzuzufügen. Aber ich bin wieder ein Neuling!! Ich habe mich gerade geändert den zweiten Parameter, habe aber vergessen, den dritten Parameter zu ändern!!!)

Die Lösung ist auch sehr einfach, geben Sie einfach den dritten Parameter ein (lacht)

Verwenden Sie getpeernamedie Wartefunktion, um das Problem zu erhalten. Die Lösung ist dieselbe. 大小Geben Sie einfach die Parameter an!

Das korrigierte Ergebnis des obigen Codes lautet also wie folgt:

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));

Referenzlink

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

おすすめ

転載: blog.csdn.net/weixin_52027058/article/details/127200464