[C言語]UDP

UDPはデータが宛先に届いたかどうかを関知しない為、到着を保証しない
複数の相手に同時にデータを送信できる、TCPは1対1のユニキャストのみ
TCPよりリアルタイム性が高い
用途は映像、音楽のストリーミング、Voice Over IPなど

### UDP受信
– ソケットを作る
– bindするIPアドレスとポートを設定
– ソケットに名前をつける
– データを受け取る

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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送信
– ソケットを作る
– 宛先を指定して送信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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についてわかってきました。