linux c自定義網路層協議收發包

2021-09-19 03:55:24 字數 1862 閱讀 9475

本文使用rawsocket收發包,也提供使用libpcap和libnet來收發包的**。

經過測試發現,libpcap的收包能力比rawsocket強。

傳送方發出10000個資料鏈路層幀,使用rawsocket大概能收到2000~3000多個,而使用libpcap抓包能收到5000多個。這大概是因為libpcap為抓取的包提供了個核心空間中的快取佇列。

send.c

#include #include #include #include #include #include #include #include #include #include #define eth_p_ndn	0x8625

int main (int argc, char **ar**)

recv.c

/**

* recv.c

*/#include #include #include #include // memset,memcpy

#include #include #include #include //struct ifreq

#include #include // struct sockaddr_ll

#define eth_p_np 0x8625

#define ifrname0 "eth0"

#define ifrname2 "vmnet1"

unsigned char dest_mac[6] = ;

int main(int argc,char **ar**)

; unsigned char *buf = null;

struct sockaddr_ll device;

socklen_t sll_len = sizeof(struct sockaddr_ll);

if((sd = socket (pf_packet,sock_raw,htons(eth_p_np))) < 0)

int recv_count = 0 ;

while(1)

buf = data + 14;

printf("%d ip data : %s : %x:%x\n",recv_count ++ ,buf,device.sll_addr[4],device.sll_addr[5]);

// 對端的mac位址

printf("the opposite mac = %x:%x:%x:%x:%x:%x\n", \

device.sll_addr[0],\

device.sll_addr[1],\

device.sll_addr[2],\

device.sll_addr[3],\

device.sll_addr[4],\

device.sll_addr[5]\

);// 從本機的哪個介面流入的

printf("recv from inte***ce id = %d \n",device.sll_ifindex) ;

break ;

} return 0;

}

解決不知道乙太網幀從哪個介面流入的問題。

當然也可以使用libpcap庫來抓包:

#include #include #include void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header,\

const u_char *pkt_data)

int main(int argc,char *ar**)

編譯 : gcc pcap.c -lpcap

Caffe自定義網路層

參考部落格 本文描述了在caffe原始碼中新增網路層的兩種情況 不帶配置引數的和帶配置引數的。示例的網路層中沒有做資料處理,傳入的資料塊直接傳出去,也沒有梯度計算。我們將要在 prototxt 中新增的網路層為 layer該網路層的型別名稱為new,沒有其他配置引數,只需要在對應位置新增.cpp和....

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

CALayer自定義層

自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcontextref ct...