UDPはデータが宛先に届いたかどうかを関知しない為、到着を保証しない
複数の相手に同時にデータを送信できる、TCPは1対1のユニキャストのみ
TCPよりリアルタイム性が高い
用途は映像、音楽のストリーミング、Voice Over IPなど
### UDP受信
– ソケットを作る
– bindするIPアドレスとポートを設定
– ソケットに名前をつける
– データを受け取る
#include <stdio.h> #include <sys/types.h> // typedef シンボルおよび構造体のコレクション #include <sys/socket.h> // Internet Protocol family #include <netinet/in.h> // Internet Protocol family int main(int argc, char** argv){ int sock; struct sockaddr_in addr; // sockaddr_inはIPアドレスやポート番号を保持する為の構造体 char buf[2048]; sock = socket(AF_INET, SOCK_DGRAM, 0); // ソケットの作成 addr.sin_family = AF_INET; // アドレスファミリ addr.sin_port = htons(12345); // ポート番号、 htonsはネットワークバイトオーダに変換 addr.sin_addr.s_addr = INADDR_ANY; // IPアドレス bind(sock, (struct sockaddr *)&addr, sizeof(addr)); // sockはソケットとアドレスの結合 memset(buf, 0, sizeof(buf)); // バイトメモリブロックのセット recv(sock, buf, sizeof(buf), 0); // ソケットからメッセージを受け取る printf("%s\n", buf); close(sock); return 0; }
### UDP送信
– ソケットを作る
– 宛先を指定して送信
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(){ int sock; struct sockaddr_in addr; sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); close(sock); return 0; }
TCP/IPはデータを切れ目のないストリームとして扱う、ストリームのイメージは固定された通信路
一方、UDPはデータグラム(塊)として扱う
TCPとUDPについてわかってきました。