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買う?
- プリンタインク
- 保険
- 松井
[ツッコミを入れる]