[ C言語 ] UDP / IP でパケットの送受信を行う

Pocket

UDP / IP でパケットの送受信を行うサンプルコードになります。 詳細はサンプル内のコメントを参照ください。なお、本サンプルコードは Solaris10 上で動作確認を行っております。

スポンサーリンク


受信側

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char** argv)
{
    int sd;
    struct sockaddr_in addr;

    socklen_t sin_size;
    struct sockaddr_in from_addr;

    char buf[2048]; // 受信バッファ

    // IPv4 UDP のソケットを作成
    if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket");
        return -1;
    }

    // 待ち受けるIPとポート番号を設定
    addr.sin_family = AF_INET;
    addr.sin_port = htons(22222);
    addr.sin_addr.s_addr = INADDR_ANY; // すべてのアドレス宛のパケットを受信する

    // バインドする
    if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("bind");
        return -1;
    }

    // 受信バッファの初期化
    memset(buf, 0, sizeof(buf));

    // 受信 パケットが到着するまでブロック
    // from_addr には、送信元アドレスが格納される
    if(recvfrom(sd, buf, sizeof(buf), 0,
                (struct sockaddr *)&from_addr, &sin_size) < 0) {
        perror("recvfrom");
        return -1;
    }

    // ソケットのクローズ
    close(sd);

    // 受信データの出力
    printf("%s\n", buf);

    return 0;
}

送信側

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char** argv)
{
    int sd;
    struct sockaddr_in addr;

    if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket");
        return -1;
    }

    // 送信先アドレスとポート番号を設定する
    // 受信プログラムと異なるあて先を設定しても UDP の場合はエラーにはならない
    addr.sin_family = AF_INET;
    addr.sin_port = htons(22222);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    // パケットをUDPで送信
    if(sendto(sd, "I am send process", 17, 0,
              (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("sendto");
        return -1;
    }

    close(sd);

    return 0;
}

コンパイル

コンパイル(リンク)時に以下のようにライブラリを 指定する必要がありました。

# 受信側プログラム
gcc -o recv recv.c -lsocket

# 送信側プログラム
gcc -o send send.c -lsocket -lnsl

 

実は管理人はテクニカルエンジニア(ネットワーク)や工事担任者の資格を保持しています。もちろんネットワークの設計・管理なども行うことができますが、ネットワークプログラミングが最も得意なのです。ただ昨年、脳を壊して引退しました。

スポンサーリンク

Pocket

One thought on “[ C言語 ] UDP / IP でパケットの送受信を行う”

  1. Pingback: [ UNIX-C ] TCP / IP でパケットの送受信を行うサンプル – 偏差値40の高い壁

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>