WinSock c++ inet_ntop始终显示 204.204.204.204(并且 accept() 没有失败)
WinSock c++ inet_ntop always displays 204.204.204.204 (and accept() didn't failed)
我正在尝试制作一个winsock服务器,我想在他连接时在服务器上显示客户端的ip,但这就是问题所在。每次我尝试连接它时,都会显示204.204.204.204。我尝试与另一台计算机连接,但结果是一样的。结果在本地主机
在此之后,我开始在这个网站上寻找与我有相同问题的人,我找到了几个与我有相同问题的人,但他们都有无法正常工作的接受或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()
的第二个参数中传递了错误变量的地址。
您正在传递要向其分配accept()
结果的SOCKET client
变量的地址。 C++允许在同一语句中声明和初始化变量时获取变量的地址。 但在这种情况下,这不是您想要的。 您需要传递sockaddr_in from
变量的地址:
sockaddr_in from;
int clientlen = sizeof(from);
// accept
SOCKET client = accept(server, (SOCKADDR*)&from, &clientlen); // <-- &from instead of &client
您将from
变量保持未初始化状态,并且编译器在调试模式下用 0xCC
(十进制 204(字节填充未初始化的变量,因此这就是为什么当您没有正确初始化from
变量时,您最终会看到204.204.204.204
(十六进制 0xCC 0xCC 0xCC 0xCC
(来自inet_ntop()
。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- C++ VISUAL STUDIO:GLFWwindow没有初始化,即使它是在文档中编写的并且以前工作过
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 为什么int myVar{5}给出错误并且不起作用?
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- C++ 从文本文件中读取每两行,并且在矢量中是安全的
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- WinSock c++ inet_ntop始终显示 204.204.204.204(并且 accept() 没有失败)