C# で Socket 通信 を行う 方法 (UDP 通信 with Socket)

0 件のコメント

Socket を利用した通信で UDP 送受信 を行う サンプルコード を掲載します。 Socket 通信 でも 正統派 コード、ここでは UDP通信 でも Socket クラス を用いた 同期処理 および 非同期処理 の サンプルコード を掲載します。

目次

UDP 同期 送受信

UDP 同期 受信 (サーバー)

正統派はこちらの実装なんでしょうか… ただただ面倒な実装なので、個人的には UdpClient の方が好みです。

public void ListenMessage()
{
    // 接続ソケットの準備
    var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
    var local = new IPEndPoint(IPAddress.Any, 8000);
    var remote = new IPEndPoint(IPAddress.Any, 8000) as EndPoint;
    socket.Bind(local);

    while (true)
    {
        var buffer = new byte[1024];

        // 受信待機
        var length = socket.ReceiveFrom(buffer, ref remote);
        
        // 受信したデータを変換
        var data = Encoding.UTF8.GetString(buffer);

        // Receive イベント を実行
        this.OnRecieve(data);
    }
}

private void OnRecieve(string data)
{
    // 受信したときの処理
}

UDP 同期 送信 (クライアント)

正統派はこちらの実装なんでしょうか… ただただ面倒な実装なので、個人的には UdpClient の方が好みです。

public void SendMessage()
{
    // 送信元の作成
    // ※設定しなくても良いが…ポート指定するときは必要
    var local = new IPEndPoint (
                        IPAddress.Parse("192.168.0.2"),
                        8000);

    // 宛先の作成
    var remote = new IPEndPoint (
                        IPAddress.Parse("192.168.0.100"),
                        8000);

    // メッセージの準備
    var message = Encoding.UTF8.GetBytes("Hello world !");

    // UDPでメッセージ送信
    var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(local);                            // ローカルアドレス、ポート番号を指定。
    socket.SendTo(message, remote);                // 同期処理で送信。送信し終わるまで処理が止まる。
    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
}

UDP 非同期 送受信

UDP 非同期 受信 (サーバー)

public void ListenMessage()
{
    // 接続先、接続元情報
    var local = new IPEndPoint(IPAddress.Any, 8000);
    var remote = new IPEndPoint(IPAddress.Any, 8000) as EndPoint;

    // 接続ソケットの準備
    var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(local);

    // 受信イベントデータを生成
    var e = new SocketAsyncEventArgs();
    e.RemoteEndPoint = remote;
    e.SetBuffer(0, 1024);
    e.Completed += this.OnReceiveCompleted;

    // 受信待機
    socket.ReceiveFromAsync(e);
}

private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
    // 受信したデータを変換
    var data = Encoding.UTF8.GetString(e.Buffer);

    // 受信した処理
    // ...

    // 再度受信ループへ
    this.ListenMessage();
}

UDP 非同期 送信 (クライアント)

public void SendMessage()
{
    // 送信元の作成
    // ※設定しなくても良いが…ポート指定するときは必要
    var local = new IPEndPoint(
                        IPAddress.Parse("192.168.86.1"),
                        8000);

    // 宛先の作成
    var remote = new IPEndPoint(
                        IPAddress.Parse("192.168.86.113"),
                        8000);

    // メッセージの準備
    var message = Encoding.UTF8.GetBytes("Hello world !");

    // 送信イベントデータ
    var e = new SocketAsyncEventArgs();
    e.RemoteEndPoint = remote;
    e.SetBuffer(message, 0, message.Length);

    // UDP送信
    var socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(local);                     // ローカルアドレス、ポート番号を指定。
    socket.SendToAsync(e);                  // 同期処理で送信。送信し終わるまで処理が止まる。
    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
}