これまでのプログラムは全てTCPを用いて記述してきました。
復習になりますが、TCPの特徴としては、再送処理をTCPが行うことと、データサーキット(データの通信路のことです, SYN と SYN ACKのやり取りで構成します)を構成してからパケットを送信することでした。

それに対しUDPでは再送処理を行いません。データサーキットを構成することもありません。
送信の度に相手方のIPアドレスとポート番号を指定し、パケットを投げっぱなしにします。
TCPが糸電話なら、UDPは矢文です。
つまり、パケットがなんらかの電波障害によってロスすることもあります。

UDPのコードもTCPのコードとほとんど同じです。


8行目を見て下さい。
TCPでは、SYNを受け取る用のソケットと、実際のパケットを受け取るソケットは区別されていました。しかし、UDPではデータサーキットを構成しないので、SYNを受け取りません。
なのでacceptが必要ありません。よってソケットは1つあればよく、またブロッキングを起こしません。

19行目にて、プロトコルの種類を指定しています。UDPを使用するのでSOCK_DGRAMを使います。

最後に、22行目と23行目です。
recvfromrecvと同じ使い方をしますが、クライアントの情報を格納する引数が付きます。ただし、クライアントのことを知る必要がない場合は省略もできます。

recvfromの第一引数には、データをレシーブするソケットを指定します。
recvfromの第二引数には、読み込んだデータを格納するアドレスを指定します。
recvfromの第三引数には、読み込むサイズを指定します。
recvfromの第四引数には、基本的に0を指定します。読み出したデータをソケットバッファから削除しないか否かや、バンド外データを受信するか否かなどを指定することもできますが、あまり使いません。
recvfromの第五引数は、クライアントの情報を格納する構造体のアドレスを指定します。クライアントの情報が不要な場合はNULLを指定することもできます。
recvfromの第六引数は、第五引数のバイト単位の大きさを格納した変数のアドレスを指定します。
変数のアドレスしか受け取らないので仕方なく、22行目にて第六引数の大きさを計算しています。
第五引数にNULLを指定した場合、第六引数にもNULLを指定します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
続いてクライアントプログラムです。


データサーキットを構成する必要がないので、connectは不要です。
sendtosendと同じ使い方をしますが、サーバーの情報を示す構造体のアドレスを渡す必要があります。

sendtoの第一引数へは、送出するソケットを指定します。
sendtoの第二引数へは、送出するパケットのアドレスを指定します。
sendtoの第三引数へは、どの位のデータを送信していいかを指定します。
sendtoの第四引数へは、基本的に0を指定します。ルーティングテーブルを迂回するか、データをバンド外で送信するかなどを指定できますが、あまり使いません。
sendtoの第五引数へは、サーバーの情報を示す構造体のアドレスを渡す必要があります。
sendtoの第六引数へは、第五引数のバイト単位の大きさを指定します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お疲れ様でした! これにてWinSock1, 2の学習は終了です。
補足なのですが、ネットワークの世界では機種、OSに依存せず通信を行うことができます。
つまり、Linux上でBSDSocketなどを使用して稼働しているサーバーサイドプログラムとクライアントプログラムの通信は全く問題なく行えます。
また、パケットの流動性を確認するにはWiresharkというソフトウェアを使用するとよいでしょう。

これからもネットワークの世界を駆け抜けて下さい。