メモの日々


2008年03月23日(日) [長年日記]

  • 一日には300行くらいしか書けないみたい。

[net][c][unix] 自IPアドレスの取得

スクリプトで取得するのではなくC言語で書く場合。自ホストIPアドレスの取得方法( Re: システムコールor 関数について) に書かれていたUDPソケットとgetsockname()を使う方法が分かりやすいと思った。ほとんど同じだけれど、自分で書いたプログラムをメモ。

  • UDPソケットに対するconnect呼び出しをしてもパケットは送信されない。UNIXネットワークプログラミングのUDPの章(8.11節)に説明があった。
  • connect呼び出しを行うには接続先のIPアドレスが必要になる。下のプログラムでは例示用のIPアドレスを使うようにしてみた。
  • やっていることはシンプルだがコードは結構長い。
  • アドレスを取得したいインタフェースの名前が分かっている場合はioctlを使うなどした方がきっと簡単。

(追記)

この方法だと、デフォルトゲートウェイが設定されていないホストで実行した場合にconnect()がエラーになってしまいIPアドレスを取得できないようだ。うーん。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>

int get_my_ip_address(
        const char* dst_address,
        char* buffer,
        size_t buffer_len) {
    struct sockaddr_in dst_sockaddr = {0};
    dst_sockaddr.sin_family = AF_INET;
    int r = inet_pton(AF_INET, dst_address, &dst_sockaddr.sin_addr);
    if (r <= 0) {
        if (r < 0) {
            perror("inet_pton");
        } else {
            fprintf(stderr, "'%s' is invalid.\n", dst_address);
        }
        return 1;
    }

    // UDPソケットをオープンして
    int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket");
        return 1;
    }

    int result = 1;

    // connectして
    if (connect(sockfd, (struct sockaddr*)&dst_sockaddr,
                sizeof(dst_sockaddr)) < 0) {
        perror("connect");
        goto end;
    }

    // getsocknameすれば自分のアドレスを取得できる
    struct sockaddr_in my_sockaddr;
    socklen_t len = sizeof(my_sockaddr);
    if (getsockname(sockfd, (struct sockaddr*)&my_sockaddr, &len) < 0) {
        perror("getsockname");
        goto end;
    }

    if (!inet_ntop(AF_INET, &my_sockaddr.sin_addr, buffer, buffer_len)) {
        perror("inet_ntop");
        goto end;
    }

    result = 0;
end:
    close(sockfd);
    return result;
}

int main(int argc, char* argv[]) {
    char* dst_address = 0;
    if (argc == 2) {
        dst_address = argv[1];
    } else {
        dst_address = "192.0.2.1"; // RFC 3330
    }

    char buffer[INET_ADDRSTRLEN];
    if (get_my_ip_address(dst_address, buffer, sizeof(buffer))) {
        printf("IP address is unknown.\n");
        exit(1);
    }
    printf("IP address: %s\n", buffer);
    return 0;
}

[life] 不動産屋と物件選びについて

今更ながら引越しについてメモ。まずは不動産屋をどう探すか。

今回、最初は現地にって不動産屋を探したが、不動産屋がたくさんありすぎてどこへ入ったらいいのか決めるのに困った。んで思ったのは、不動産屋へ行って物件を探すよりもウェブで探した方がいいということ。

不動産屋に行くと色々物件を紹介してもらえるけど、後からウェブで検索してみたらそのほとんどがウェブ上にもあった。また、不動産屋の外に貼ってある物件は中に入ると全然紹介されない(ただの客寄せのようだ)。だから、現地に行って色々探すよりもウェブで探した方が効率がいいと思う。

ウェブ上での検索サイトも色々あるけれど、おれが使ったのはフォレントYahoo!不動産。Yahooにはフォレントの情報も流れていた。こういう所で気になる物件を見つけ、メイルで申し込み不動産屋へ行って内見させてもらうという流れ。

[life] 保証人の審査

今回、申し込んだが審査の際に保証人の収入が足りないという理由で契約できなかった物件があった。うちの親ももう歳で、あまり収入がなく保証人として認めてもらえないみたい。貧乏は辛いね。

結局、契約できた物件も親は保証人になれず、カード会社のオリコが保証人の代わりになるという仕組みに頼ることになった。手数料は家賃の1%なのでそれ程負担にはならない。

保証人不要で契約できるかどうかは不動産屋や大家の都合があるので、メイルで申し込む際に聞いておくのがいいと思う。

[life][service] 引越し屋選び

引越し屋選びも面倒。今回、見積依頼を代行してくれる引越し比較.comというサービスを利用したが、結果色々な引越し屋からメイルがどんどん来るし、勝手に電話を掛けてくる業者もいて辟易した。こんなことなら自分で見繕った引越し屋に個別に申し込む方がいいと思う。どこもメイルで概算の見積もりは出してくれると思う。

引越し業者の口コミ情報があるサイトを少しメモ。

まあ、良し悪しの印象は会社よりも引越しをしてくれる担当者で決まるような気がする。おれはどんどん来たメイルの中からそこそこ大手のダック引越しセンターに頼んで、担当者のお兄さんが爽やかないい人でラッキーだったと思う。2トン車、移動時間1時間、平日、作業員2人で31500円だった。

やること

  • シュレッダー
  • 健康保険料
  • 請求書