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

标签 c++ linux sockets

自从我使用 C++ 以来已经有很长时间了,所以这可能是一个基本问题,但我似乎找不到解决方案。

我需要编写一个小型 C++ 套接字类,它可以查找给定主机/端口的 IP 地址。尽管我不确定如何从结构数组向调用函数返回单个 addrinfo 结构(我在下面标记了该行),但在类内部一切正常。我已经尝试过 memcopy、指针等。似乎没有任何效果。

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 做任何事情

关于C++ 套接字 - 从结构数组返回单个地址信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23350542/

相关文章:

c - Valgrind:是否有内存泄漏?

c++ - 从网络摄像头捕获单个图像

C++ : deleting multiple elements of a list while iterating the list

c++ - 找不到程序入口点?

c++ - 增加特定套接字的 TCP 接收窗口

c - 使用套接字读取 char* 时出现段错误

linux - AF_UNIX 套接字的默认协议(protocol)

查找时间为 O(1) 的 C++ 数据结构,就像 STL 中的 java HashMap 一样?

linux操作系统返回值

windows - 忽略 git 中的符号链接(symbolic link)