繁体   English   中英

c ++-ptr-> ai_family与AF_INET做什么

[英]c++ - What does ptr->ai_family do vs AF_INET

我正在通过msdn的“ Winsock入门 ”,他们用参数打开了一个套接字

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

iResult = getaddrinfo(
        argv[1], 
        DEFAULT_PORT, 
        &hints, 
        &result
);

ptr=result;

ConnectSocket = socket(
        ptr->ai_family,                 // Address Family (address families like ipv6 ipv4)
        ptr->ai_socktype,               // Type (Like tcp, udp ect)
        ptr->ai_protocol                // Protocol to use (0 = service provider chooses)
    );

但是二进制程序“ Winsock教程 ”确实是这样的(他们正在使用C,但我已经看到人们使用C ++来做到这一点)

s = socket(
    AF_INET , 
    SOCK_STREAM , 
    0 
)

ptr->是做什么的? 为什么只将其设置为AF_INET而不使用它?

另外,如果您有空闲时间并且非常了解套接字,我将不胜感激。

socket(ptr->ai_family,ptr->ai_socktype, ptr->ai_protocol);

传入变量以创建套接字,而不是对值进行硬编码。 您得到的好处是该代码可同时用于IPv4和IPv6。

ptr->ai_family只是一个整数,是struct addrinfo的成员。 (如果您想知道ptr->的特定语法,可以讨论这个问题 ),它将具有AF_INETAF_INET6的值(或理论上任何其他受支持的协议)

调用getaddrinfo()将查找主机名,并将其解析为IPv4或IPv6,然后将结果传递给socket()以创建适当类型的套接字。 如果主机名解析为IPv4主机,则创建一个可以处理IPv4的套接字;如果主机名解析为IPv6,则创建一个IPv6套接字。

如果改为将值硬编码(例如,作为AF_INET ,则仅支持IPv4,而ptr->ai_family可以是AF_INETAF_INET6

c++ 向量指针没有正确大小的向量<object> * ptr, ptr-&gt;size 错误<div id="text_translate"><p>这是我的代码</p><pre>#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Student // EdgeContainer { string name = ""; vector&lt;string&gt; *addresses = nullptr; Student() { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student()" &lt;&lt; endl; } Student(const Student &amp;stu) { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student(const Student &amp;stu)" &lt;&lt; endl; name = stu.name; addresses = stu.addresses; } void print() { cout &lt;&lt; name &lt;&lt; " " &lt;&lt; addresses &lt;&lt; " size=" &lt;&lt; addresses-&gt;size() &lt;&lt; endl; if (addresses;= nullptr) { for (int i = 0; i &lt; addresses-&gt;size(); i++) { cout &lt;&lt; i &lt;&lt; " " &lt;&lt; (*addresses)[i] &lt;&lt; endl; } } cout &lt;&lt; "----------------\n"; } }; struct Printer //ToyView { vector&lt;Student *&gt; students; vector&lt;vector&lt;string&gt;&gt; stu_addresses; void add_student() { for (int i = 0; i &lt; 10; i++) { vector&lt;string&gt; address. address;push_back("addr1"). address;push_back("addr2"). stu_addresses;push_back(address); Student *stu = new Student. students;push_back(stu); students[i]-&gt;name = "stu" + to_string(i); students[i]-&gt;addresses = &amp;stu_addresses[i]; cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; stu-&gt;addresses &lt;&lt; " size=" &lt;&lt; stu-&gt;addresses-&gt;size() &lt;&lt; endl. } } void print() { cout &lt;&lt; " students size=" &lt;&lt; students;size() &lt;&lt; endl; for (int i = 0. i &lt; students;size(); i++) { cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; students[i]-&gt;addresses &lt;&lt; endl; // students[i]-&gt;addresses = &amp;stu_addresses[i]; students[i]-&gt;print(); } } }; int main() { Printer printer. printer;add_student(). printer;print(); return 0; }</pre><p> 这是一些结果:</p><pre> ../vector_cp.cpp 13 Student() 0 stu-&gt;address=0x563888ac6f30 size=2../vector_cp.cpp 13 Student() 1 stu-&gt;address=0x563888ac7418 size=2../vector_cp.cpp 13 Student() 2 stu-&gt;address=0x563888ac74f0 size=2../vector_cp.cpp 13 Student() 3 stu-&gt;address=0x563888ac7508 size=2../vector_cp.cpp 13 Student() 4 stu-&gt;address=0x563888ac76c0 size=2../vector_cp.cpp 13 Student() 5 stu-&gt;address=0x563888ac76d8 size=2../vector_cp.cpp 13 Student() 6 stu-&gt;address=0x563888ac76f0 size=2../vector_cp.cpp 13 Student() 7 stu-&gt;address=0x563888ac7708 size=2../vector_cp.cpp 13 Student() 8 stu-&gt;address=0x563888ac7a10 size=2../vector_cp.cpp 13 Student() 9 stu-&gt;address=0x563888ac7a28 size=2 students size=10 0 stu-&gt;address=0x563888ac6f30 stu0 0x563888ac6f30 size=18446744073709549283</pre><p> 我希望 students[0]-&gt;addresses.size() 应该是 2,但它显示了垃圾编号。 取消注释此行后 // students[i]-&gt;addresses = &amp;stu_addresses[i]; 代码实际上是有效的,即students[0]-&gt;addresses.size()。 我仍然无法弄清楚为什么会这样。 任何人都可以帮忙吗?</p></div></object>

[英]c++ vector pointer does not have correct size vector<Object>* ptr, ptr->size is wrong

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 仅在 macOS 上不支持 C/C++ getnameinfo ai_family 不支持C / C ++ getnameinfo ai_family ai_family的有效值是多少? c++ 向量指针没有正确大小的向量<object> * ptr, ptr-&gt;size 错误<div id="text_translate"><p>这是我的代码</p><pre>#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Student // EdgeContainer { string name = ""; vector&lt;string&gt; *addresses = nullptr; Student() { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student()" &lt;&lt; endl; } Student(const Student &amp;stu) { cout &lt;&lt; __FILE__ &lt;&lt; " " &lt;&lt; __LINE__ &lt;&lt; " Student(const Student &amp;stu)" &lt;&lt; endl; name = stu.name; addresses = stu.addresses; } void print() { cout &lt;&lt; name &lt;&lt; " " &lt;&lt; addresses &lt;&lt; " size=" &lt;&lt; addresses-&gt;size() &lt;&lt; endl; if (addresses;= nullptr) { for (int i = 0; i &lt; addresses-&gt;size(); i++) { cout &lt;&lt; i &lt;&lt; " " &lt;&lt; (*addresses)[i] &lt;&lt; endl; } } cout &lt;&lt; "----------------\n"; } }; struct Printer //ToyView { vector&lt;Student *&gt; students; vector&lt;vector&lt;string&gt;&gt; stu_addresses; void add_student() { for (int i = 0; i &lt; 10; i++) { vector&lt;string&gt; address. address;push_back("addr1"). address;push_back("addr2"). stu_addresses;push_back(address); Student *stu = new Student. students;push_back(stu); students[i]-&gt;name = "stu" + to_string(i); students[i]-&gt;addresses = &amp;stu_addresses[i]; cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; stu-&gt;addresses &lt;&lt; " size=" &lt;&lt; stu-&gt;addresses-&gt;size() &lt;&lt; endl. } } void print() { cout &lt;&lt; " students size=" &lt;&lt; students;size() &lt;&lt; endl; for (int i = 0. i &lt; students;size(); i++) { cout &lt;&lt; i &lt;&lt; " stu-&gt;address=" &lt;&lt; students[i]-&gt;addresses &lt;&lt; endl; // students[i]-&gt;addresses = &amp;stu_addresses[i]; students[i]-&gt;print(); } } }; int main() { Printer printer. printer;add_student(). printer;print(); return 0; }</pre><p> 这是一些结果:</p><pre> ../vector_cp.cpp 13 Student() 0 stu-&gt;address=0x563888ac6f30 size=2../vector_cp.cpp 13 Student() 1 stu-&gt;address=0x563888ac7418 size=2../vector_cp.cpp 13 Student() 2 stu-&gt;address=0x563888ac74f0 size=2../vector_cp.cpp 13 Student() 3 stu-&gt;address=0x563888ac7508 size=2../vector_cp.cpp 13 Student() 4 stu-&gt;address=0x563888ac76c0 size=2../vector_cp.cpp 13 Student() 5 stu-&gt;address=0x563888ac76d8 size=2../vector_cp.cpp 13 Student() 6 stu-&gt;address=0x563888ac76f0 size=2../vector_cp.cpp 13 Student() 7 stu-&gt;address=0x563888ac7708 size=2../vector_cp.cpp 13 Student() 8 stu-&gt;address=0x563888ac7a10 size=2../vector_cp.cpp 13 Student() 9 stu-&gt;address=0x563888ac7a28 size=2 students size=10 0 stu-&gt;address=0x563888ac6f30 stu0 0x563888ac6f30 size=18446744073709549283</pre><p> 我希望 students[0]-&gt;addresses.size() 应该是 2,但它显示了垃圾编号。 取消注释此行后 // students[i]-&gt;addresses = &amp;stu_addresses[i]; 代码实际上是有效的,即students[0]-&gt;addresses.size()。 我仍然无法弄清楚为什么会这样。 任何人都可以帮忙吗?</p></div></object> 为什么 socket(AF_INET, SOCK_STREAM, 0) 返回 -1? AF_INET为什么不能与SOCK_STREAM一起使用? 如何通过AF_INET域套接字连接到ipv6地址? 在C ++中Ptr &lt;&gt; a代表什么? 为什么 socket(AF_.NET, SOCK_STREAM, 0) 返回 1434,超过 1024,然后使程序崩溃 为什么套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP)失败?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM