Linux下的packet socket使用總結

2021-08-08 11:44:21 字數 1434 閱讀 2739

pcap的實現即基於此介面,在實際專案中因為經常因為開源軟體被審計,自己使用此介面實現了二層報文的收發。

介面使用如下:

上節講到的raw socket雖然已經能處理ip層的資料了,但是在實際的應用中可能需要獲取更加底層的報文資訊。這就需要用到另一種更加強大的socket建立方式——packet socket,建立之後直接可以操作包括以太層在內的報文資料。

packet socket的建立方式如下:

socket(af_packet, int socket_type, int protocol);
其中socket_type有sock_raw 和 sock_dgram兩種型別,它們的區別如下: 

使用sock_raw引數建立的packet socket收到的資料報含以太頭及以太頭以上的資料; 

使用sock_dgram引數建立的packet socket收到的資料不包含以太頭。

protocol引數常用的有eth_p_ip,eth_p_arp和eth_p_all三種,指定為eth_p_ip後可以抓取arp報文,指定eth_p_arp後可以抓取arp報文,指定eth_p_all後可以抓取所有報文。需要注意的是這個引數在指定時需要將協議型別轉換為網路序傳入,如htons(eth_p_all),否則會導致無法抓取到預期的報文。更多的以太層協議型別可以在linux/if_ether.h標頭檔案中找到。 

建立了packet socket後,預設情況下所有網口的報文都能收到,如果只想收到指定網口的報文,需要使用bind介面傳入struct sockaddr_ll結構來設定。struct sockaddr_ll結構定義如下:

struct sockaddr_ll ;
sll_protocol是標準的以太層協議,預設為建立socket時的指定的協議型別,具體定義見linux/if_ether.h; 

sll_ifindex是網絡卡的介面索引,傳入0將匹配所有介面,介面索引可以使用if_nametoindex介面獲取; 

sll_hatype是arp的型別,具體定義見linux/if_arp.h; 

sll_pkttype指定報文的型別,有效的型別有packet_host, packet_broadcast, packet_multicast, packet_otherhost,packet_outgoing五種,分別表示發往本地主機、以太層廣播報文、以太層多播報文、發往其他主機的報文和本地主機的環回報文。這些型別只在接收報文時有效; 

sll_halen和sll_addr分別用來表示報文的mac位址長度和報文的mac位址。

如果用packet socket來傳送報文,sll_family,sll_addr, sll_halen和sll_ifindex這四個引數就夠了,其他引數應該都賦值為0。在呼叫bind介面時只有sll_protocol和sll_ifindex會被用到。

Linux下ZendOptimizer的安裝與配置

內容 在裝的好的red hat linux 9 apache 2.0.55 mysql 5.1.6 php 5.1.2後,接下來就是安裝linux下的php加速器zendoptimizer 2.6.2了。自己編譯 php 後,zend optimizer 2.6.2 需要自己設定一下,請參照以下步驟...

Linux下的命令

管理員 普通使用者 pwd 顯示當前檔案全路徑 date 顯示系統當前日期和時間 who 顯示當前已登入的所有使用者名稱 cal 顯示日曆 uname r m,i,v 顯示當前系統作業系統資訊 wc l 行數,w字數,c位元組數 統計字數 clear 清屏 檔案操作touch 新建檔案mkdir 新...

linux 下 奇怪的

最近在做乙個從hp ux移行到linux 上面的專案,遇到乙個命令 hp ux date y m d h m s read sys date sys time dev null 2 1 但是這個命令在linux 下,就達不到預期的結果 之後問了高手,才得到解決辦法 linux read sys da...