当socket()中的“type”是SOCK_DNOWN或SOCK_STREAM时,我们需要指定“protocol”吗?

bq9c1y66  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(84)

关于APUE

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

其中:

  • type可以是SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET, SOCK_STREAM,并且
  • protocol可以是IPPROTO_TCPIPPROTO_UDP,.

SOCK_DGRAM可以与IPPROTO_UDP一起使用,但不能与IPPROTO_TCP一起使用吗?
SOCK_STREAM可以与IPPROTO_TCP一起使用,但不能与IPPROTO_UDP一起使用吗?
如果答案是肯定的,是否意味着当typeSOCK_DGRAMSOCK_STREAM时,我们不需要指定protocol

rsl1atfo

rsl1atfo1#

来自socket(2)的手册页:

  • protocol* 指定要与套接字一起使用的特定协议。通常,在给定的协议族中,只有一个协议支持特定的套接字类型,在这种情况下,协议可以指定为0。然而,可能存在许多协议,在这种情况下,必须以这种方式指定特定的协议。所使用的协议号是特定于进行通信的“通信域”的;见方案(5)。关于如何将协议名称字符串Map到协议编号,请参见getprotoent(3)。

所以是否需要指定protocol字段,取决于domaintype字段。假设域为AF_INET,即IPv4,则SOCK_DGRAMSOCK_STREAM的协议字段都应设置为0。ip(7)的手册页显示了以下内容:
概要

#include <sys/socket.h>
   #include <netinet/in.h>
   #include <netinet/ip.h> /* superset of previous */

   tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
   udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
   raw_socket = socket(AF_INET, SOCK_RAW, protocol);

...
通过调用socket(2)函数作为socket(AF_INET,socket_type,protocol)来创建IP套接字。有效的套接字类型是SOCK_STREAM,用于打开tcp(7)套接字,SOCK_DNOW,用于打开udp(7)套接字,或SOCK_RAW,用于打开raw(7)套接字以直接访问IP协议。protocol是要接收或发送的IP报头中的IP协议。**协议的唯一有效值是0和IPPROTO_TCP(对于TCP套接字),0和IPPROTO_UDP(对于UDP套接字)。**对于SOCK_RAW,您可以指定RFC 1700中定义的有效IANA IP协议。
ipv6(7)手册页显示了一些不同的内容:
概要

#include <sys/socket.h>
   #include <netinet/in.h>

   tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0);
   raw6_socket = socket(AF_INET6, SOCK_RAW, protocol);
   udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocol);

对于IPv6,似乎可以指定protocol字段,尽管手册页没有说明允许哪些值。

edqdpe6u

edqdpe6u2#

answer by dbush已经过时了。以下是当前ip(7)man page状态:

protocol is the IP protocol in the IP header to be received or sent.
Valid values for protocol include:

   •  0 and IPPROTO_TCP for tcp(7) stream sockets;

   •  0 and IPPROTO_UDP for udp(7) datagram sockets;

   •  IPPROTO_SCTP for sctp(7) stream sockets; and

   •  IPPROTO_UDPLITE for udplite(7) datagram sockets.

   For SOCK_RAW you may specify a valid IANA IP protocol defined in
   RFC 1700 assigned numbers.

正如您所看到的,目前每个流和数据报套接字类型都有两种不同的协议。而protocol参数则指定将其中哪一个用于相应的套接字类型。

相关问题