• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubybathyscaphegamewindowspythonphpguic翻訳omegattwitterframeworkbtronarduinovb.net計画中(planning stage)directxpreviewertestゲームエンジンdom

ソケットを使ってクライアントサーバプログラムを作成するための C# ライブラリ


Commit MetaInfo

Révisionff463ba9f50bd4a84a389afefef1b252075687f1 (tree)
l'heure2015-08-23 12:38:12
Auteurtsntsumi <tsntsumi@tsnt...>
Commitertsntsumi

Message de Log

データ受信方式を ReceiveAsync() に変更

BeginReceive/EndReceive を使った APM から ReceiveAsync を使った TAP に変更した。

Change Summary

Modification

--- a/src/SocketNet/SocketNet/UdpServer.cs
+++ b/src/SocketNet/SocketNet/UdpServer.cs
@@ -37,39 +37,10 @@ namespace SocketNet
3737 public abstract class UdpServer
3838 {
3939 protected UdpClient udpClient;
40- protected AsyncCallback asyncCallback;
4140
4241 protected volatile bool acceptingConnections;
4342
4443 /// <summary>
45- /// 非同期メソッドの BeginReceive/EndReceive 呼び出しで渡される
46- /// オブジェクトをインスタンシエイトするためのクラスです。
47- /// </summary>
48- protected class UdpState
49- {
50- /// <summary>
51- /// 関連付けられたクライアントを取得します。
52- /// </summary>
53- public UdpClient Client { get; private set; }
54-
55- /// <summary>
56- /// 関連付けられた IP エンドポイントを取得します。
57- /// </summary>
58- public IPEndPoint IPEndPoint { get; private set; }
59-
60- /// <summary>
61- /// コンストラクタ。
62- /// </summary>
63- /// <param name="client">関連付けられたクライアント。</param>
64- /// <param name="ipEndPoint">関連付けられたIPエンドポイント。</param>
65- public UdpState(UdpClient client, IPEndPoint ipEndPoint)
66- {
67- Client = client;
68- IPEndPoint = ipEndPoint;
69- }
70- }
71-
72- /// <summary>
7344 /// データを受信したときに発行されます。
7445 /// </summary>
7546 public event EventHandler<UdpDataReceivedEventArgs> DataReceived;
@@ -148,27 +119,42 @@ namespace SocketNet
148119 /// <param name="ipAddress">バインドするIPアドレス。</param>
149120 /// <param name="port">バインドするポート番号。</param>
150121 /// <param name="transmissionType">転送タイプ。</param>
151- protected UdpServer (IPAddress ipAddress, int port, TransmissionType transmissionType)
122+ protected UdpServer(IPAddress ipAddress, int port, TransmissionType transmissionType)
152123 {
153124 IPAddress = ipAddress;
154125 Port = port;
155126 TransmissionType = transmissionType;
156- asyncCallback = new AsyncCallback(EndReceive);
157127 }
158128
159129 /// <summary>
160130 /// Udpサーバを開始してデータ受信を開始します。
161131 /// </summary>
162- public void Start()
132+ public async void Start()
163133 {
164134 IPEndPoint ipEndPoint = new IPEndPoint(IPAddress, Port);
165135
166136 Setup(ipEndPoint);
167137
168- UdpState udpState = new UdpState(udpClient, ipEndPoint);
138+ try
139+ {
140+ acceptingConnections = true;
141+
142+ while (acceptingConnections)
143+ {
144+ var result = await udpClient.ReceiveAsync();
145+ var data = result.Buffer;
169146
170- acceptingConnections = true;
171- udpClient.BeginReceive(asyncCallback, udpState);
147+ if (data != null && data.Length > 0)
148+ {
149+ OnDataReceived(new UdpDataReceivedEventArgs(result.RemoteEndPoint, data));
150+ }
151+ }
152+ }
153+ catch (ObjectDisposedException)
154+ {
155+ // Suppress error
156+ acceptingConnections = false;
157+ }
172158 }
173159
174160 /// <summary>
@@ -196,35 +182,6 @@ namespace SocketNet
196182 }
197183
198184 /// <summary>
199- /// UdpClient.EndReceive を呼び出します。
200- /// </summary>
201- /// <param name="asyncResult">BeginReceive 呼び出しから送られる結果オブジェクト。</param>
202- protected void EndReceive(IAsyncResult asyncResult)
203- {
204- try
205- {
206- UdpState udpState = (UdpState)asyncResult.AsyncState;
207- UdpClient udpClient = udpState.Client;
208- IPEndPoint ipEndPoint = udpState.IPEndPoint;
209-
210- byte[] data = udpClient.EndReceive(asyncResult, ref ipEndPoint);
211- if (data != null && data.Length > 0)
212- {
213- OnDataReceived(new UdpDataReceivedEventArgs(ipEndPoint, data));
214- }
215-
216- if (acceptingConnections)
217- {
218- udpClient.BeginReceive(asyncCallback, udpState);
219- }
220- }
221- catch (ObjectDisposedException)
222- {
223- // Suppress error
224- }
225- }
226-
227- /// <summary>
228185 /// DetaReceived イベントを発行します。
229186 /// </summary>
230187 /// <param name="e">イベントデータを格納するオブジェクト。</param>