簡體   English   中英

當socket()中的“類型”為SOCK_DGRAM或SOCK_STREAM時,是否需要指定“協議”?

[英]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_TCPIPPROTO_UDP ,...

SOCK_DGRAM可以與IPPROTO_UDP ,但不能與IPPROTO_TCP

SOCK_STREAM可以與IPPROTO_TCP ,但不能與IPPROTO_UDP嗎?

如果答案是肯定的,那是否意味着當typeSOCK_DGRAMSOCK_STREAM時我們不需要指定protocol嗎?

在用於socket(2)的手冊頁中:

協議指定要與套接字一起使用的特定協議。 通常,在給定協議族中,只有一個協議可以支持特定的套接字類型,在這種情況下,協議可以指定為0。但是,可能存在許多協議,在這種情況下,必須在其中指定一個特定的協議。方式。 使用的協議號特定於要進行通信的“通信域”; 參見協議(5)。 有關如何將協議名稱字符串映射到協議編號的信息,請參見getprotoent(3)。

因此,是否需要指定協議字段取決於類型字段。 假設域是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_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM