アプリ版:「スタンプのみでお礼する」機能のリリースについて

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>のようなものは使わずにできたらいいな、と考えています。
こちらの勉強もした方がいいとは思いますが、とりあえず基本的なものを用いて勉強しようと考えています。

私の調べ方・勉強方法が悪いのもあるとは思いますが、どうかよろしくお願いします。

A 回答 (2件)

#1さんの回答通り、それはLinuxでのパケットキャプチャーの方法だと思います。

こういうOSに近いところについて調べるときはOSの名前も一緒に入れて検索したほうがよいです。
*BSDではBerkeley Packet Filter (BPF)を使います。

ざっと検索したら、こんな例を見つけました。
https://gist.github.com/msantos/939154

あと、パケットを書き換えたいとしたら、natdの真似事をするというのもあるかもしれないですね。

パケットキャプチャーでOS関係なく実装する場合はpcapを使ったほうがよいでしょうね。
pcapがその違いを吸収してくれると思うので。
    • good
    • 0
この回答へのお礼

やはりOSの違いというのが問題になるんですね。
私の認識不足でした。

さらに幅広く知識も増やしていこうと思います。
アドバイスと例まで示してくださり、ありがとうございました。

お礼日時:2014/01/25 10:05

参考にされたサイトの例は全てLinux系なのでは?


パケットキャプチャのやり方は統一されてるわけではないのでどのOSでも同じやり方でできるというわけではないです。
FreeBSDの場合は、bpfを使ってください。
FreeBSD版のpcapもbpfを使って実装されてます。
なのでサイトに例がなくてもpcapのソースで勉強するという手もあります。
    • good
    • 0
この回答へのお礼

確かにブックマークしたサイトを見たらLinuxのプログラミングでした。
UNIX系OSなら全部いけるだろうと思っていたので、そのあたりの知識がかなり欠けているようです・・・。
素早い回答とヒントも与えて下さり、ありがとうございました。

お礼日時:2014/01/25 10:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!