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についてわかってきました。