关于APUE
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
其中:
type
可以是SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET, SOCK_STREAM
,并且protocol
可以是IPPROTO_TCP
,IPPROTO_UDP
,.
SOCK_DGRAM
可以与IPPROTO_UDP
一起使用,但不能与IPPROTO_TCP
一起使用吗?SOCK_STREAM
可以与IPPROTO_TCP
一起使用,但不能与IPPROTO_UDP
一起使用吗?
如果答案是肯定的,是否意味着当type
是SOCK_DGRAM
或SOCK_STREAM
时,我们不需要指定protocol
?
2条答案
按热度按时间rsl1atfo1#
来自
socket(2)
的手册页:所以是否需要指定protocol字段,取决于domain和type字段。假设域为
AF_INET
,即IPv4,则SOCK_DGRAM
和SOCK_STREAM
的协议字段都应设置为0。ip(7)
的手册页显示了以下内容:概要
...
通过调用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)
手册页显示了一些不同的内容:概要
对于IPv6,似乎可以指定
protocol
字段,尽管手册页没有说明允许哪些值。edqdpe6u2#
answer by dbush已经过时了。以下是当前
ip(7)
的man page状态:正如您所看到的,目前每个流和数据报套接字类型都有两种不同的协议。而
protocol
参数则指定将其中哪一个用于相应的套接字类型。