libpcap/send_a_packet.c
libpcap其實也能夠送出封包,但是做法比較偏向Raw socket,所以對剛入門的初學者可能稍微會比較難,這個程式會簡單送出一個封包稍微介紹。
Source Code
//
// send_a_packet.c
// 功能:送出一個封包。
// Created by 聲華 陳 on 2016/01/18.
//
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
int main(int argc, const char * argv[]) {
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *handle = NULL;
u_char packet[] = "\x01\x02\x03\x04\x05\x06\xff\xff\xff\xff\xff\xff\x81\x00";
int length = sizeof(packet) - 1;
handle = pcap_open_live("en0", 65535, 1, 1, errbuf);
if(!handle) {
fprintf(stderr, "pcap_open_live: %s\n", errbuf);
exit(1);
}//end if
//send packet
if(pcap_sendpacket(handle, packet, length) < 0) {
fprintf(stderr, "pcap_sendpacket: %s\n", pcap_geterr(handle));
}//end if
//free
pcap_close(handle);
return 0;
}
結果
分析
u_char packet[] = "\x01\x02\x03\x04\x05\x06\xff\xff\xff\xff\xff\xff\x81\x00";
int length = sizeof(packet) - 1;
變數packet
就是封包內容,宣告方式是使用16進位表示法。變數length
是封包的長度,會使用sizeof()
是直接取得變數packet
的宣告大小,不過一定會多1個空間(給'\0'的空間),所以要減掉1。
handle = pcap_open_live("en0", 65535, 1, 1, errbuf);
if(!handle) {
fprintf(stderr, "pcap_open_live: %s\n", errbuf);
exit(1);
}//end if
我們要從Interfaceen0
送出封包,所以pcap_open_live()
的第二、三和四的參數要給多少不影響送封包。
//send packet
if(pcap_sendpacket(handle, packet, length) < 0) {
fprintf(stderr, "pcap_sendpacket: %s\n", pcap_geterr(handle));
}//end if
只要呼叫pcap_sendpacket()
就可以送出封包了。
//free
pcap_close(handle);
一定記得要釋放資源。
結論
libpcap送出封包只要呼叫一個函數就可以完成了,也能夠呼叫pcap_inject()
,差別只在於回傳值不同,所以就不再多介紹,至於要怎麼填寫封包欄位,後面Raw socket會再介紹。