和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);
不能从按值传递给该函数的参数中的函数返回值。 singleAddress
是 getAddressInfo
的局部变量。您可以根据需要修改它,调用方将看不到任何内容。
您需要熟悉通过引用/指针传递参数。