[英]Do we need to specify “protocol” when “type” is SOCK_DGRAM or SOCK_STREAM in socket()?
從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
嗎?
在用於socket(2)
的手冊頁中:
該協議指定要與套接字一起使用的特定協議。 通常,在給定協議族中,只有一個協議可以支持特定的套接字類型,在這種情況下,協議可以指定為0。但是,可能存在許多協議,在這種情況下,必須在其中指定一個特定的協議。方式。 使用的協議號特定於要進行通信的“通信域”; 參見協議(5)。 有關如何將協議名稱字符串映射到協議編號的信息,請參見getprotoent(3)。
因此,是否需要指定協議字段取決於域和類型字段。 假設域是AF_INET
,即IPv4,則應將SOCK_DGRAM
和SOCK_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_DGRAM打開udp(7)套接字; SOCK_RAW打開raw(7)套接字以直接訪問IP協議。 protocol是IP報頭中要接收或發送的IP協議。 協議的唯一有效值為TCP套接字為0和IPPROTO_TCP,UDP套接字為0和IPPROTO_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
字段,盡管手冊頁沒有說明允許的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.