本文使用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...