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會再介紹。

results matching ""

    No results matching ""