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
実は管理人はテクニカルエンジニア(ネットワーク)や工事担任者の資格を保持しています。もちろんネットワークの設計・管理なども行うことができますが、ネットワークプログラミングが最も得意なのです。ただ昨年、脳を壊して引退しました。
Pingback: [ UNIX-C ] TCP / IP でパケットの送受信を行うサンプル – 偏差値40の高い壁