http://linux.die.net/man/2/socket
协议规定了与之一起使用的特定协议 插座。通常只存在一个协议来支持特定的协议 给定协议族中的套接字类型,在这种情况下协议可以 被指定为0.但是,许多协议可能是 存在,在这种情况下,必须在此指定特定协议 方式。要使用的协议号是特定于通信的 域'进行沟通的对象;
http://linux.die.net/man/5/protocols
字段描述为:
协议协议的本机名称。例如ip,tcp或 UDP。
当我们已经指定第二个参数sock dgram或sock stream时,为什么我们还需要protocol参数?
答案 0 :(得分:5)
有或可能有许多不同的数据报或流协议。 对于流协议,AF_INET和AF_INET6域(当您传递0时)的典型默认值是TCP,而对于数据报协议,则是UDP。
另一个有趣的协议是SCTP,它可以在数据报和流模式下运行,因此您可以通过以下任一方式创建SCTP套接字:
socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
socket(AF_INET, SOCK_DGRAM, IPPROTO_SCTP);
可以使用
创建UDP-lite变体socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);
另请注意,socket()是一般调用,可用于创建非基于IP的套接字,例如:用于蓝牙,红外,CANbus协议,可能提供您可以使用的不同协议。