socket()系统调用中的参数协议代表什么?

时间:2014-12-16 14:47:49

标签: linux sockets tcp udp

http://linux.die.net/man/2/socket

  

协议规定了与之一起使用的特定协议   插座。通常只存在一个协议来支持特定的协议   给定协议族中的套接字类型,在这种情况下协议可以   被指定为0.但是,许多协议可能是   存在,在这种情况下,必须在此指定特定协议   方式。要使用的协议号是特定于通信的   域'进行沟通的对象;

http://linux.die.net/man/5/protocols

  

字段描述为:

     

协议协议的本机名称。例如ip,tcp或   UDP。

当我们已经指定第二个参数sock dgram或sock stream时,为什么我们还需要protocol参数?

1 个答案:

答案 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协议,可能提供您可以使用的不同协议。