1. 程式人生 > >原始套接字

原始套接字

步驟 傳遞 進程 讀寫 使用 整數 註意 完整 raw

定義原始套接字的目的在於提供訪問某個協議的接口, 通過原始套接字, 進程可以讀寫ICMPv4, IGMPv4和ICMPv6等分組, 進程也可以讀寫內核不處理其協議字段的IPv4數據報, 進程還可以使用IP_HDRINCL套接字選項自行構造IPv4首部。

創建一個原始套接字步驟如下:

int sockfd = socket(AF_INET, SOCK_RAW, protocol) 或者

int sockfd = socket(AF_INET6, SOCK_RAW, protocol)

其中protocol 通常不為0, 比如在ping程序中, protocol指定為IPPROTO_ICMP或IPPROTO_ICMPV6。

值得註意的是, 通過IPv6原始套接字發送和接收的協議首部中的所有字段均采用網絡字節序, 另外通過IPv6原始套接字無法讀入或寫出完整的IPv6分組, 包括IPv6首部或任何擴展首部, 如果應用進程需要讀入或者寫出完整的IPv6數據報, 那就必須使用數據鏈路訪問。

無論何時, 往一個原始IPv4套接字遞送一個接收到的數據報, 傳遞到該套接字所在進程的都是包括IP首部在內的完整數據報, 而對於IPv6套接字, 傳遞到套接字的只是扣除了IPv6首部和所有擴展首部的凈荷

原始套接字