自从我使用 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/