ai_addr 包含什么?

问题描述 投票:0回答:1

我目前正在学习套接字编程,在编程时我注意到在很多函数中你需要传递来自

addrinfo*
的东西,我理解大多数东西的作用。但我的问题是: ai_addr 到底是什么?我从来没有指定过它,但如果我让程序输出它所具有的值,我会得到一个奇怪的类似哈希的结果。它是数字和字母的混合,尽管前 5 个符号似乎总是 000000。我假设它是本地网络的 IP 或 TCP,但对我来说,我得到的输出看起来不像 IP 地址,由于我使用
AF_INET
作为网络系列,它应该是 IPx4 地址,但事实并非如此。

当我查看定义 ai_addr 的库时,我也找不到答案,并且在线查找也没有帮助我。 我当前的代码:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <iostream>

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

WSADATA wsaData;

int main()
{
    int iResult;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

#define DEFAULT_PORT "27015"

    struct addrinfo* result = NULL, * ptr = NULL, hints;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }


    SOCKET ListenSocket = INVALID_SOCKET;
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (iResult == SOCKET_ERROR) {
        printf("bind failed with error: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    std::cout << result->ai_addr << ' ' << result->ai_addrlen;

    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
        printf("Listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    SOCKET ClientSocket;

    ClientSocket = INVALID_SOCKET;

    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

我还使用 Visual Studio 2021 社区版。

c++ server ip ip-address
1个回答
0
投票

套接字 API 支持任何不同类型的寻址系列。

ai_addr
字段是指向适合于
ai_family
字段中指定的系列的结构的指针。

例如:

  • ai_family
    AF_INET
    (IPv4) 时,
    ai_addr
    指向包含 IPv4 地址和端口的
    sockaddr_in
    结构体。

  • ai_family
    AF_INET6
    (IPv6) 时,
    ai_addr
    指向包含 IPv6 地址、端口和范围 id 的
    sockaddr_in6
    结构体。

© www.soinside.com 2019 - 2024. All rights reserved.