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