Cでのネットワークプログラミングを少々かじっている者です。
とりあえず完成しているプログラムを見て勉強しようと思い、パケットキャプチャのサンプルプログラムを動かそうと考えてコンパイルしたのですが、どうもうまく動かない部分があります。
ソケットを生成する箇所で、下のようなソースを書いたのですが、その中の「AF_PACKET」と「ETH_P_ALL」が私の使っている環境になく、そこでどうしても止まってしまいます。
int rawsock = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;
様々なホームページ等を閲覧しましたが、多くのページがこの方法を採用しており、代替手段が今一つ見つかりません。
インポートしているヘッダファイルの中身もすべて検索をかけて見たのですが、確かに上の記述はありませんでした。
インポートしているヘッダファイルは以下の通りです。
#include<stdio.h>等の基本的なものは省いています。
#include<sys/ioctl.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<netinet/tcp.h>
#include<netinet/udp.h>
#include<netinet/ip_icmp.h>
#include<netinet/if_ether.h>
#include<net/ethernet.h>
#include<arpa/inet.h>
#include<errno.h>
#include<netdb.h>
#include<unistd.h>
現在の動作環境は以下の通りです。
OS : FreeBSD 9.2
コンパイラ : gcc 4.2.1
FreeBSDそのものが違う様式を採用しているわけではないとは思うのですが・・・。
ただ、構造体の変数やそのメンバが異なっていた部分も結構あったので、釈然としない所もあります。
何かこれらの代わりに使えるようなものはあるのでしょうか。
それとも、FreeBSDではこれは無理、とか根本的な要因でもあるのでしょうか。
ただ、できたら<pcap.h>のようなものは使わずにできたらいいな、と考えています。
こちらの勉強もした方がいいとは思いますが、とりあえず基本的なものを用いて勉強しようと考えています。
私の調べ方・勉強方法が悪いのもあるとは思いますが、どうかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
#1さんの回答通り、それはLinuxでのパケットキャプチャーの方法だと思います。
こういうOSに近いところについて調べるときはOSの名前も一緒に入れて検索したほうがよいです。*BSDではBerkeley Packet Filter (BPF)を使います。
ざっと検索したら、こんな例を見つけました。
https://gist.github.com/msantos/939154
あと、パケットを書き換えたいとしたら、natdの真似事をするというのもあるかもしれないですね。
パケットキャプチャーでOS関係なく実装する場合はpcapを使ったほうがよいでしょうね。
pcapがその違いを吸収してくれると思うので。
やはりOSの違いというのが問題になるんですね。
私の認識不足でした。
さらに幅広く知識も増やしていこうと思います。
アドバイスと例まで示してくださり、ありがとうございました。
No.1
- 回答日時:
参考にされたサイトの例は全てLinux系なのでは?
パケットキャプチャのやり方は統一されてるわけではないのでどのOSでも同じやり方でできるというわけではないです。
FreeBSDの場合は、bpfを使ってください。
FreeBSD版のpcapもbpfを使って実装されてます。
なのでサイトに例がなくてもpcapのソースで勉強するという手もあります。
確かにブックマークしたサイトを見たらLinuxのプログラミングでした。
UNIX系OSなら全部いけるだろうと思っていたので、そのあたりの知識がかなり欠けているようです・・・。
素早い回答とヒントも与えて下さり、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mapの初期化
-
JPEGやPNGが読めるLoadImage関数
-
C++ 数値データファイルから2次...
-
string型からint型への型変換
-
findnext();について
-
Vectorのポインタが入ったvector
-
テイラー展開とその精度について
-
C++のifstreamの使い方
-
string型のフォーマット書式指...
-
Visial C++おけるπの使い方
-
switch文のエラーについて
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
信頼区間の1.96や1.65ってどこ...
-
寄り付きからぐわんぐわん値が...
-
「Aに対するBの割合」と「Aに対...
-
ある商品のロス率を5%見込み、...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
DLLの関数呼び出しで引数がある...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
switch文のエラーについて
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
空ENTERの判別
-
std::wstringのメモリリークに...
-
C言語からgnuplot呼び出し
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
このプログラミング誰か教えて...
-
プログラミング
-
#include "fstream.h"
-
C++での <iostream.h>と<iostre...
-
std::map の const 修飾について
-
構造体配列のvectorへの変換と...
-
#defineの使い方について
-
VS2019でofstreamが未定義になる
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報