首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >winsock:当使用localhost (127.0.0.1)时,连接失败,错误为10049

winsock:当使用localhost (127.0.0.1)时,连接失败,错误为10049
EN

Stack Overflow用户
提问于 2012-08-15 13:22:58
回答 2查看 14.6K关注 0票数 4

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

当我尝试运行一个简单的连接和发送数据到服务器的测试时,“客户端”在调用它的错误代码10049 (WSAEADDRNOTAVAIL) MSDN上的连接功能时失败。

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

  1. 创建服务器套接字->将其绑定到端口12345
  2. 将套接字置于侦听模式
  3. 呼叫接受

客户端

  1. 创建套接字->,将其绑定到随机端口
  2. 呼叫连接:连接到本地主机,端口12345

=>连接调用失败,错误为10049,如上文所述

这里是的主要功能,包括"server":

代码语言:javascript
运行
复制
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)
{...

客户端线程函数

代码语言:javascript
运行
复制
unsigned int WINAPI Procy(void* p)

{

代码语言:javascript
运行
复制
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;
}...

连接函数

代码语言:javascript
运行
复制
    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的函数对象.服务器函数的-Noone返回任何错误,并在使用调试器或允许它们单独运行时按预期的方式工作.

我很高兴听到你的建议.

编辑:--当我不连接到("localhost","12345")但是("",12345).当查看getaddrinfo的地址解析过程时,它给出了127.0.0.1表示"localhost",my 实IP表示""

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 15:13:00

你的问题的答案是:

..。它为127.0.0.1提供了"localhost",为""提供了真正的IP

这意味着您的服务器绑定到接口的实际IP而不是INADDR_ANY,也就是说它不监听回送。

编辑0:

在创建侦听套接字时,并不需要真正的名称解析。只需将其bind()INADDR_ANY以侦听所有可用的接口(包括回送)。

票数 5
EN

Stack Overflow用户

发布于 2021-08-29 07:52:13

在我的例子中,此错误是由于在将htonl分配给address.sin_addr.s_addr之前没有在INADDR_LOOPBACK上调用它。

确保您转换为网络字节顺序,否则您将得到0x0100007f (1.0.0.127)而不是0x7f000001 (127.0.0.1)作为您的回送地址,绑定将在代码10049 (WSAEADDRNOTAVAIL)中失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11970069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档