2006年05月18日(木) [長年日記]
- 朝から打ち合わせ。全然ダメ。
■ [net] rawソケットからの入力を待つプログラム
貧相なプログラムを作ったので忘れないようにメモ。プロトコル番号100のIPデータグラムを受信したらその内容をダンプする。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> void dump_message(char *recvbuf, int len) { int i; printf("received\n"); for (i = 0; i < len; i++) { printf("%02x ", (unsigned char)recvbuf[i]); } printf("\n"); } void read_raw_socket(void) { int sockfd; char recvbuf[1000]; ssize_t n; sockfd = socket(AF_INET, SOCK_RAW, 100); setuid(getuid()); if (sockfd < 0) { perror("socket"); exit(1); } for (;;) { n = recv(sockfd, recvbuf, sizeof(recvbuf), 0); if (n < 0) { perror("recvfrom"); exit(1); } dump_message(recvbuf, n); } } int main() { printf("start\n"); read_raw_socket(); }
UNIXネットワークプログラミングのrawソケットの章に、socketの第3引数に0を指定すれば全てのプロトコルのデータグラムを受信できるよう書かれていたが、0を指定すると「Protocol not supported」というエラーになってしまう。raw (7)には
IPPROTO_RAW 経由でのあらゆる IP プロトコルの受信は、 raw ソケットを用いては行えない。
とあるからできないのかな。
ああ、同じくrawのマニュアルに、
一般に raw ソケットは移植性がないことが多いので、移植性が必要なプログラムでは避けるべきである。
とあった。仕様を確認してから使わないといけないのだな。
■ やること
- テーブル生成
- デザイン変更
- TV買う?
- プリンタインク
- 保険
- 松井