我在玩伯克利插座,然后我这样做了:
#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(第三个参数)是必要的,那么(第一个参数)和(第二个参数)
的所有可能组合可以采用什么值?domaintype
如果有人可以用示例解释这一点,那将非常有帮助,否则也可以。谢谢