C言語でLibpcap,オープン可能なデバイスのリストを構築する

スポンサーリンク

鍛錬 744

C言語でLibpcap,オープン可能なデバイスのリストを構築する

pcap_findalldevs()関数を使用することにより、pcap_open_live()関数で開くことができるネットワークデバイスのリストを構築することができます。
 
以下は、pcap_findalldevs()関数についてです。

#include <pcap/pcap.h>

int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
 

引数

以下は、上記の引数についてです。

順序 引数 意味
第1引数 pcap_if_t **alldevsp リストの内、最初の要素へのポインタ
第2引数 char *errbuf エラー時に適切なメッセージが格納される配列

戻り値

以下は、戻り値についてです。

戻り値 意味
0 成功
PCAP_ERROR (= -1) エラー

デバイスが見つからない場合は成功とみなされ 0 が返されます。

PCAP_ERROR (= -1) が返された場合、関数の第2引数である errbuf にエラーメッセージが格納されます。

errbuf のサイズは、少なくとも PCAP_ERRBUF_SIZE 文字の保持が想定されています。

 
スポンサーリンク

プログラム

以下は、pcap_open_live()関数でオープン可能なネットワークデバイスのリストを構築するプログラム、get_alldevs.c です。

// include
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>

// main
int main(void)
{
	pcap_if_t *alldevsp = NULL;
	pcap_if_t *tmp_alldevsp = NULL;
	char errbuf[PCAP_ERRBUF_SIZE] = "";
	int ret;
	
	// pcap_open_live()でopen可能な,
	// ネットワークデバイスのリストを構築する
	ret = pcap_findalldevs(&alldevsp, errbuf);
	if (ret == -1) {
		printf("ERROR,pcap_findalldevs(),ret=%d,%s", ret, errbuf);
		exit(EXIT_FAILURE);
	}
	
	while (1) {
		// pcap_open_live()に渡すデバイス名
		printf("name[%s]\n", alldevsp->name);
		
		// 人間が読むことのできる表記での,デバイスについての説明
		if (alldevsp->description != NULL) {
			printf("description[%s]\n", alldevsp->description);
		}
		else {
			printf("description[NULL]\n");
		}
		printf("\n");
		
		// リストの内,次の要素へのポインタ
		if (alldevsp->next != NULL) {
			tmp_alldevsp = alldevsp->next;
			alldevsp = tmp_alldevsp;
		}
		// リストの内,最後の要素の場合
		else {
			break;
		}
	}
	
	// ネットワークデバイスのリストを解放
	pcap_freealldevs(alldevsp);
	
	return 0;
}

実行結果

以下は、プログラム get_alldevs.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra get_alldevs.c -o get_alldevs -lpcap
***@ubuntu:~/***/test/c$ sudo ./get_alldevs
name[ens33]
description[NULL]

name[lo]
description[NULL]

name[any]
description[Pseudo-device that captures on all interfaces]

name[nflog]
description[Linux netfilter log (NFLOG) interface]

name[nfqueue]
description[Linux netfilter queue (NFQUEUE) interface]

 
上記に示した通り、ネットワークデバイスのリストを構築することができました。

スポンサーリンク

シェアする

フォローする