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

0 件のコメント

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

目次

UDP 同期 送受信

UDP 同期 受信 (サーバー)

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

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
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 の方が好みです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 非同期 受信 (サーバー)

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
31
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 非同期 送信 (クライアント)

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
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();
}

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!