LoginSignup
2
0

More than 3 years have passed since last update.

[D言語] UDPを用いた文字列のやり取り

Last updated at Posted at 2021-03-07

UDP ( User Datagram Protocol )

UDP は通信プロトコルの一つですが, どういったものなのかというお話は詳しく説明されている記事は多くありますので省略します.

UDP は相手の応答を待たずデータを送信するため, パケットが喪失する場合があり信頼性は低下しますが, その分TCPよりも高速にデータを送信できます.

D言語で簡単なプログラムを実装する機会があったのでメモしておきます.

D言語での実装

受信側 ( recv.d )

  • 送信側からバイト列を受け取る
  • 受け取ったバイト列を文字列に変換
  • 受け取った文字列を出力

送信側 ( send.d )

  • ユーザは文字列を入力
  • 入力された文字列をバイト列に変換
  • 受信側へ変換した文字列を送信

実装には, 標準ランタイムに含まれる std.socket.UdpSocket クラスを利用します.
送信側で, 送信する文字列は, バイト単位の配列で送る必要があるため OutBuffer を用いて入力された文字列を変換しています.

recv.d
// 受信側
import std.socket;
import std.stdio;

int main() {
  auto socket = new UdpSocket();
  auto addr = new InternetAddress( "localhost", 8080 ); // アドレスlocalhostのポート8080を指定

  socket.bind( addr ); // ソケットへの名前付け
  while ( true ) {
    ubyte[2048] recv_buf;
    socket.receive( recv_buf );
    writeln( "Received: ", cast(string) recv_buf ); // バイト列を文字列にキャストして出力
  }

  return 0;
}
send.d
// 送信側
import std.socket;
import std.stdio;
import std.outbuffer;
import std.string;

int main() {
  auto socket = new UdpSocket();
  auto addr = new InternetAddress( "localhost", 8080 ); // アドレスlocalhostのポート8080を指定
  socket.connect( addr ); // 接続

  // 100回までサーバに文字列を送信する
  foreach(i; 0..100) {
    // バイト単位に変換して文字列を送信
    auto send_buf = new OutBuffer();
    string str = readln().chomp(); // 送信したい文字列の入力
    send_buf.write( str );

    socket.send( send_buf.toBytes() );
  }

  return 0;

まとめ

送信側・受信側双方を別々のターミナルを用い実行し, 送信側で入力した内容が受信側で受け取れていることが確認できると思います.

UDP はC言語でしか実装したことがなかったため, よい勉強になりました.

UDP の特性をきちんと理解すれば利用できる機会は多そうです.

参考

dlang.org - udp_socket
DIGITAL MARS - std.outbuffer

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0