画像をUDPで送る/受け取る


[注意] IPヘッダ中の「ヘッダ長フィールド(4bit)」が「ヘッダの長さ/4」を表していて、 通常の値は5でありIPヘッダ長が20byteであることを表します(IPヘッダの最大長は60byte)。 IPヘッダ中の「全データ長フィールド」はIPデータグラムの全長をバイト数で表しており、 これと「ヘッダ長フィールド」から 「IPデータグラム中のデータの始まりの位置とデータの長さ」がわかります。 全データ長フィールドは 16bit 幅なのでIPデータグラムの最大サイズは 65535 バイトです。 65535バイトのIPデータグラムを転送することは可能ですが、 普通はIP層でフラグメント化されて送られます。

実は、ホストは 576 バイト以上のデータグラムを受信するように要求されてはいません。 TCPはユーザのデータをフラグメント化するのでこの制限の影響を受けません。 UDPでは多くのアプケーション(RIP, TFTP, BOOTP, DNS, SNMP など)が ユーザのデータを 512バイト以下の長さにすることでこの影響から免れています (NFSを実装する多くのシステムでは、8192byte以上のIPデータグラムを許していますが)。

ブロードキャスト・アドレスにUDPデータグラムを送信する場合は、 512byte以下のデータサイズになるようにする方が安全です。 そうしないと、システムによっては送信時にerror が発生します。

下に示すプログラム例では一度に送るUDPのデータ長は 4*2+3*128=392バイト以下に制限しています。

UDPはコネクションを確立しないので、ブロードキャストアドレスを宛先として送信できます。 そのため、同じネットワークに接続されれいる複数のクライアントに一斉に情報を送ることができます。

津田塾大学計算センターs205wsの教室のネットワークのネットワーク・アドレスは 172.17.0.0/23 なので、 ブロードキャスト・アドレスは 172.17.1.255 となります(2019年4月8日時点)。

自宅のブロードキャストアドレスは、自分のPCのIPアドレスをipconfig コマンド(Windows)や/sbin/ifconfig コマンド(Mac)などで調べて 自分で計算して下さい(2020年6月20日追記)。。


UDPサーバ(受信側)




UDPWinShareRecv.java
UDPWinShareServer.java
UDPWinShareServer.javaの実行例
% javac UDPWinShareServer.java  
% java UDPWinShareServer -p 8888  

受信に失敗した UDP パケットの部分の影響で、画像が欠けていることがわかります。 しばらく時間がたつと、だんだん画像が、クライアント側の表示と等しくなっていきます。


UDPクライアント(送信側)




UDPWinShareSend.java
UDPWinShareClient.java
UDPWinShareClient.javaの実行例
% javac UDPWinShareClient.java  
% java UDPWinShareClient -h 192.168.66.255 -p 8888  
Pressed 45 79
menu 2
Released 45 79
Pressed 229 194
Released 614 405
Pressed 535 293
Released 697 483
Pressed 38 127
menu 4
Released 38 127
Pressed 217 126
Released 358 414
Pressed 74 46
menu 1
Released 75 47
...

上記のUDPWinShareClient.javaの実行例は、私の自宅のネットワークにおけるブロードキャストアドレス (192.168.66.255)を指定しています。 PC1台で試す場合はIPアドレスは localhost または 127.0.0.1 と指定して下さい。