【发布时间】:2017-07-22 18:58:21
【问题描述】:
我在玩伯克利插座,然后我这样做了:
#include <iostream>
#include <sys/socket.h>
#include <cstring>
int main()
{
auto res = socket(AF_INET6, SOCK_STREAM, 58);
if (res < 0) {
std::cout << " Error in creating socket: " << strerror(errno) << '\n';
}
return 0;
}
输出是:Error in creating socket: Protocol not supported。我选择了 58,因为我想尝试 ICMP IPv6 套接字作为示例,并使用 /etc/protocols 的内容我得到了这个:
ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6。
然后我在上面的代码中尝试用0 代替58,程序运行良好。
所以我的问题是:
如果我们有,为什么在 socket() 调用中需要第三个参数
已经在第二个参数中指定SOCK_STREAM(TCP) 作为协议,即这个protocol(第三个参数)存在的原因是什么?如果
protocol(第三个参数)是必要的,那么它可以采用什么值domain(第一个参数)和type(第二个参数)的所有可能组合 论点)?
如果有人可以用示例解释这一点,那将非常有帮助,否则也可以。 谢谢
【问题讨论】:
标签: sockets tcp network-programming c++14 berkeley-sockets