gpt4 book ai didi

c++ - winsock:使用 localhost (127.0.0.1) 时连接失败并出现错误 10049

转载 作者:可可西里 更新时间:2023-11-01 09:21:07 31 4
gpt4 key购买 nike

我写了一个类封装了一些 winsock 函数来模拟一个简单的 TCP 套接字来满足我的需要...

当我尝试运行一个简单的“连接并发送数据到服务器”测试时,“客户端”调用连接失败,错误代码为 10049 (WSAEADDRNOTAVAIL) connect function on MSDN

我正在做的是(下面的代码):服务器:

  1. 创建服务器套接字 -> 将其绑定(bind)到端口 12345
  2. 将套接字置于监听模式
  3. 调用接受

客户端

  1. 创建一个socket -> 绑定(bind)到一个随机端口
  2. 调用连接:连接到本地主机,端口 12345

=> 如上所述,连接调用失败并出现错误 10049

这是包括“服务器”在内的主要功能:

HANDLE hThread = NULL;
Inc::CSocketTCP ServerSock;
Inc::CSocketTCP ClientSock;

try
{

ServerSock.Bind(L"", L"12345");
ServerSock.Listen(10);

//Spawn the senders-thread
hThread = (HANDLE)_beginthreadex(nullptr, 0, Procy, nullptr, 0, nullptr);

//accept
ServerSock.Accept(ClientSock);


//Adjust the maximum packet size
ClientSock.SetPacketSize(100);


//receive data
std::wstring Data;
ClientSock.Receive(Data);

std::wcout << "Received:\t" << Data << std::endl;
}
catch(std::exception& e)
{...

客户端线程函数

unsigned int WINAPI Procy(void* p)

{

Sleep(1500);
try{
Inc::CSocketTCP SenderSock;
SenderSock.Bind(L"", L"123456");

SenderSock.Connect(L"localhost", L"12345");


//Adjust packet size
SenderSock.SetPacketSize(100);

//Send Data
std::wstring Data = L"Hello Bello!";
SenderSock.Send(Data);
}
catch(std::exception& e)
{
std::wcout << e.what() << std::endl;
}...

连接函数

    int Inc::CSocketTCP::Connect(const std::wstring& IP, const std::wstring& Port)
{
//NOTE: assert that the socket is valid
assert(m_Socket != INVALID_SOCKET);

//for debuggin: convert WStringToString here
std::string strIP = WStringToString(IP), strPort = WStringToString(Port);

Incgetaddrinfo AddyResolver;
addrinfo hints = {}, *pFinal = nullptr;

hints.ai_family = AF_INET;

//resolve the ip/port-combination for the connection process
INT Ret = AddyResolver(strIP.c_str(), strPort.c_str(), &hints, &pFinal);
if(Ret)
{
//error handling: throw an error description
std::string ErrorString("Resolving Process failed (Connect): ");
ErrorString.append(Inc::NumberToString<INT>(Ret));
throw(std::runtime_error(ErrorString.c_str()));
}


/*---for debbuging---*/
sockaddr_in *pP = (sockaddr_in*)(pFinal->ai_addr);
u_short Porty = ntohs(pP->sin_port);
char AddBuffer[20] = "";

InetNtopA(AF_INET, (PVOID)&pP->sin_addr, AddBuffer, 20);
/*--------------------------------------------------------*/


if(connect(m_Socket, pFinal->ai_addr, pFinal->ai_addrlen) == SOCKET_ERROR)
{
int ErrorCode = WSAGetLastError();
if((ErrorCode == WSAETIMEDOUT) || (ErrorCode == WSAEHOSTUNREACH) || (ErrorCode == WSAENETUNREACH))
{
//Just Unreachable
return TCP_TARGETUNREACHABLE;
}

//real errors now
std::string ErrorString("Connection Process failed: ");
ErrorString.append(Inc::NumberToString<int>(ErrorCode));
throw(std::runtime_error(ErrorString.c_str()));
}

return TCP_SUCCESS;
}

附加信息:-Incgetaddrinfo 是一个函数对象,封装了getaddrinfo...- 当使用调试器单步执行它们或让它们单独运行时,没有任何服务器函数返回任何错误并按预期工作......

我很高兴听到您的建议可能是什么问题...

编辑:当我连接到("localhost","12345")时它起作用,但是("",12345)...当查看 getaddrinfo 的地址解析过程时,它为 "localhost" 和我的 real IP 提供了 127.0.0.1对于 ""

为什么它不适用于我的环回 IP?

最佳答案

你的问题有答案:

... it gives 127.0.0.1 for "localhost" and my real IP for ""

这意味着您的服务器绑定(bind)到接口(interface)的真实 IP 而不是 INADDR_ANY,即它不监听环回。

编辑0:

创建监听套接字时,您实际上不需要名称解析。只需将其bind()INADDR_ANY 即可监听所有可用接口(interface)(包括环回)。

关于c++ - winsock:使用 localhost (127.0.0.1) 时连接失败并出现错误 10049,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970069/

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