C++套接字 - 从结构数组返回单个地址信息

C++ Sockets - Returning single addrinfo from array of strcutures

本文关键字:返回 单个地址 信息 数组 结构 套接字 C++      更新时间:2023-10-16
我已经很久没有

和C++一起工作了,所以这可能是一个基本问题,但我似乎找不到解决方案。

我需要编写一个小的C++套接字类,可以查找给定主机/端口的IP地址。在类中一切正常,尽管我不确定如何将单个 addrinfo 结构(我在下面标记了一行(从结构数组返回到调用函数。 我尝试过内存复制、指针等。似乎什么都不起作用。

Getaddrinfo 返回一个地址结构数组 (m_addList(。编译/运行时,类内的结果与返回的结果完全不同。请注意,为了简单起见,我简化了示例。

./lookup www.stackoverflow.com 80
=> 2
=> 1
-> 32767
-> 4197087

标有"=>"的值是正确的,可用于生成套接字,尽管"->"值不正确,导致套接字错误。

法典:

#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <iostream>
using namespace std;
class getAddress
{
private:
    struct addrinfo *m_addList;  // List of returned address info structures
public:
    int getAddressInfo(char* host, char* port, struct addrinfo singleAddress);
};
int getAddress::getAddressInfo(char* host, char* port, struct addrinfo singleAddress)
{
    int ret;
    struct addrinfo addCriteria;
    memset(&addCriteria, 0, sizeof(addCriteria));
    addCriteria.ai_family = AF_UNSPEC;
    addCriteria.ai_socktype =  SOCK_STREAM;
    addCriteria.ai_protocol = IPPROTO_TCP;
    ret = getaddrinfo(host, port, &addCriteria, &m_addList);
    if (ret != 0)
        return -1;
    // Simply return the first address found
    singleAddress = *m_addList;                // <---- This is my problem
    cout << "=> " << singleAddress.ai_family << endl;
    cout << "=> " << singleAddress.ai_socktype << endl;
    return 0;
}
int main(int argc, char* argv[])
{
    int res;
    struct addrinfo inVal;
    if (argc < 3)
        cout << "Usage: main [domain] [port]" << endl;
    getAddress adObj;
    res = adObj.getAddressInfo(argv[1], argv[2], inVal);
    if (res == 0)
    {
        cout << "-> " << inVal.ai_family << endl;
        cout << "-> " << inVal.ai_socktype << endl;
    }
}

非常感谢您的帮助!

将函数更改为:

int getAddress::getAddressInfo(char* host, char* port, struct addrinfo &singleAddress)

就像现在一样,您只是修改singleAddress的本地副本,并且对inVal

int getAddressInfo(char* host, char* port, struct addrinfo singleAddress);

不能从按值传递给该函数的参数中的函数返回值。 singleAddressgetAddressInfo 的局部变量。您可以根据需要修改它,调用方将看不到任何内容。

您需要熟悉通过引用/指针传递参数。