メモの日々


2006年05月18日(木) [長年日記]

  • 朝から打ち合わせ。全然ダメ。

[net][unix] ネットワーク関連のマニュアル

をいくつかちょっとメモ。

[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買う?
  • プリンタインク
  • 保険
  • 松井