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
accept
Ich habe dieses Problem mit den Funktionen hier . getpeername
Wenn 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.204
oder 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.204
von uns angegebenen Typs geschrieben wurden.SOCKADDR_IN
Lösung
accept
Fü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, NULL
aber 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 getpeername
die 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