我在玩伯克利插座,然后我这样做了:
#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() 调用中需要这个第三个参数,如果我们
已经在第二个参数中指定(TCP)作为协议,即这个(第三个参数)SOCK_STREAM
存在的原因是什么?protocol
如果
protocol
(第三个参数)是必要的,那么(第一个参数)和(第二个参数)
的所有可能组合可以采用什么值?domain
type
如果有人可以用示例解释这一点,那将非常有帮助,否则也可以。谢谢