Linux下的Packet Socket的使用

2021-04-26 06:59:04 字數 1343 閱讀 8593

linux下的packet socket的使用

hanse

2009-4-3

linux支援pf_packet型別的套接字,用於實現使用者層的網路協議。通過該sock_raw型別的packet socket,應用程式可以直接接收帶完整二層資料幀,處理完畢後再使用該socket發出二層資料幀。因此可以實現更底層的網路協議。也可以通過該型別的socket實現網路抓包,當然,如果要抓取不是自己的網路報文,還需要把網絡卡設定為混雜模式。

1、建立packet socket

#include

#include

#include /* the l2 protocols */

packet_socket = socket(pf_packet, int socket_type, int protocol);

其中socket_type可以是sock_dgram,sock_raw。設定為sock_raw則接收到的報文中包含二層協議頭,否則只有二層資料幀內容。

例如:int skfd;

skfd = socket(pf_packet, sock_raw, htons(protocol));

2、繫結到網路介面

這一步是可選的。如果不繫結,則所有介面上的二層資料幀都會收到。

struct sockaddr_ll ll;

struct ifreq ifr;

strncpy(ifr.ifr_name, l2->ifname, sizeof(ifr.ifr_name));

memset(l2, 0, sizeof(*l2));

strncpy(l2->ifname, ifname, sizeof(l2->ifname));

memset(&ll, 0, sizeof(ll));

ll.sll_family = pf_packet;

ll.sll_ifindex = ifr.ifr_ifindex;

ll.sll_protocol = htons(protocol);

if (bind(l2->fd, (struct sockaddr *) &ll, sizeof(ll)) < 0)

protocol是需要監聽的協議型別,如果為eth_p_all,則接收所有資料幀。

注意:橋中接收不到**的非自己的報文

ssize_t recvfrom(int s, void *buf, size_t len, int flags,

struct sockaddr *from, socklen_t *fromlen);

如果傳入fromlen為0則不會填充from引數。

1、linux man: packet(7)

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...