gpt4 book ai didi

c++ - WinSock c++ inet_ntop 总是显示 204.204.204.204(并且 accept() 没有失败)

转载 作者:行者123 更新时间:2023-11-28 04:14:38 24 4
gpt4 key购买 nike

我正在尝试制作一个 winsock 服务器,我想在他连接时在服务器上显示客户端的 ip,但这就是问题所在。每次我尝试连接时,它都会显示 204.204.204.204。我尝试连接另一台计算机,但结果是一样的。 result in localhost

在此之后,我开始在这个网站上寻找和我有同样问题的人,我发现了几个和我有同样问题的人,但他们要么接受要么 inet_ntop 函数不能正常工作。所以我检查了一下,这两个函数都没有返回错误。也许我很愚蠢,但我真的无法弄清楚问题出在哪里。 (顺便说一句,英语不是我的第一语言,所以请告诉我你是否注意到或者我的英语不是太差)

不工作的代码部分

sockaddr_in from;
int clientlen = sizeof(from);
// accept
SOCKET client = accept(server, (SOCKADDR*)&client, &clientlen);
if (client == INVALID_SOCKET)
{
std::cout << "Error in accept(): " << WSAGetLastError << std::endl;
WSACleanup();
}
else
{

char clientIp[17];
if (inet_ntop(AF_INET, &from.sin_addr, clientIp, 17) == NULL)
{
std::cout << "Can't get the client's ip: " << WSAGetLastError() << std::endl;
}

std::cout << "ip connected: " << clientIp << std::endl;

完整的代码,如果你需要的话

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>

#pragma comment(lib, "ws2_32.lib")

int main()
{
std::cout << "--- Tcp/ip Server ---" << std::endl;
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);

SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
if (server == INVALID_SOCKET)
{
std::cout << "error in SOCKET(): "<< WSAGetLastError() << std::endl;
WSACleanup();
}
sockaddr_in s;
s.sin_family = AF_INET;
s.sin_addr.s_addr = INADDR_ANY;
s.sin_port = htons(52000);

// bind
if (bind(server, (sockaddr*)&s, sizeof(s)) == SOCKET_ERROR)
{
std::cout << "Error: bind()" << std::endl;
}
//listen
if (listen(server, SOMAXCONN) == SOCKET_ERROR)
{
std::cout << "Error in listen(): " << WSAGetLastError() << std::endl;
WSACleanup();
}
sockaddr_in from;
int clientlen = sizeof(from);
// accept
SOCKET client = accept(server, (SOCKADDR*)&client, &clientlen);
if (client == INVALID_SOCKET)
{
std::cout << "Error in accept(): " << WSAGetLastError << std::endl;
WSACleanup();
}
else
{

char clientIp[17];
if (inet_ntop(AF_INET, &from.sin_addr, clientIp, 17) == NULL)
{
std::cout << "Can't get the client's ip: " << WSAGetLastError() << std::endl;
}

std::cout << "ip connected: " << clientIp << std::endl;

// the code isn't finished yet

system("pause");
WSACleanup();
}
return 0;
}

最佳答案

您在 accept() 的第二个参数中传递了错误变量的地址。

您正在传递您的 SOCKET 客户端 变量的地址,您将要将 accept() 的结果分配给该变量。 C++ 允许在同一语句中声明和初始化变量时获取变量的地址。但在这种情况下,这不是您想要的。您需要从 变量传递 sockaddr_in 的地址:



sockaddr_in from;
int clientlen = sizeof(from);
// accept
SOCKET client = accept(server, (SOCKADDR*)&from, &clientlen); // <-- &from instead of &client

您的 from 变量未初始化,您的编译器在 Debug模式下用 0xCC(十进制 204)字节填充未初始化的变量,所以这就是您最终看到的原因204.204.204.204(十六进制 0xCC 0xCC 0xCC 0xCC)来自 inet_ntop() 当你没有初始化你的 from适当的变量。

关于c++ - WinSock c++ inet_ntop 总是显示 204.204.204.204(并且 accept() 没有失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com