
前提
C# .NetFrameWork4.6.2で開発を行っております。
UDP送信クラス(同期処理)と受信クラス(非同期処理)をそれぞれ作成したところ、
UDPの送受信が正しく動作する時と動作しない時があり原因がわからず悩んでおります。
UDP送信側はサーバに配置されるコンソールアプリでUDP受信側はクライアントPCに配置されるWindowsFormsアプリを想定しています。
受信側は画面を伴ったアプリの為、画面のロックを回避したいと考えており、
受信待ちの処理と受信後に行う処理は非同期で行う想定で実装しております。
wiresharkを使用してパケットを確認したところ動作しない時はUDP送信は行われているため
受信側の実装に不備があるものと思われます。
知識不足により見よう見まねで作成しているため非同期処理の部分がうまく出来ていないのではないかと
考えておりますが、実装不備な箇所をご指摘いただけないでしょうか。
実現したいこと
UDP受信が行われない事があるため、
ソフト面・ハード面のどちらが原因であるか突き止め、
ソフトが原因であれば対応を行いたい。
該当のソースコード
送信側クラス
C#
1 public class SendHelper : IDisposable 2 { 3 UdpClient client { get; set; } 4 5 public SendHelper(int port) 6 { 7 client = new UdpClient(port); 8 } 9 10 public void SendMessage(string message, string destinationAddress, int destinationPort) 11 { 12 client.Connect(new IPEndPoint(IPAddress.Parse(destinationAddress), destinationPort)); 13 var enc = Encoding.GetEncoding("utf-8"); 14 var s = Encoding.UTF8.GetBytes(message); 15 client.Send(s, enc.GetByteCount(message)); 16 } 17 18 public async void SendMessageAsync(string message, string destinationAddress, int destinationPort) 19 { 20 client.Connect(new IPEndPoint(IPAddress.Parse(destinationAddress), destinationPort)); 21 await client.SendAsync(Encoding.UTF8.GetBytes(message), message.Length); 22 } 23 24 ~SendHelper() 25 { 26 Dispose(); 27 } 28 29 public void Dispose() 30 { 31 if (client != null) 32 { 33 client.Close(); 34 client = null; 35 } 36 } 37 }
受信側クラス
C#
1 public class RecieveHelper : IDisposable 2 { 3 UdpClient client { get; set; } 4 5 public RecieveHelper(string ipAddress, int port) 6 { 7 var address = IPAddress.Parse(ipAddress); 8 client = new UdpClient(new IPEndPoint(address, port)); 9 } 10 11 ~RecieveHelper() 12 { 13 Dispose(); 14 } 15 16 public void Dispose() 17 { 18 if (client != null) 19 { 20 // 排他制御 21 lock (this) 22 { 23 client.Close(); 24 client = null; 25 } 26 } 27 } 28 29 public delegate void OnRecieveAction(string s); 30 31 public async void ListenStart(OnRecieveAction action) 32 { 33 while (true) 34 { 35 Task<UdpReceiveResult> receiveTask; 36 // 排他制御 37 lock (this) 38 { 39 if (client == null) 40 { 41 // Disposeされたのでループを抜ける 42 break; 43 } 44 // ヌルポ回避 ←上記if文と下記コードが無い場合、Dispose()で破棄された時に例外が発生 45 receiveTask = client.ReceiveAsync(); 46 } 47 // 非同期で受信待機 48 var result = await receiveTask; 49 50 var data = Encoding.UTF8.GetString(result.Buffer); 51 await Task.Run(() => { 52 action(data); 53 }); 54 } 55 } 56 }
受信側クラスを使用しているコード
C#
1RecieveHelper = new RecieveHelper(AppConfig.IPAddress, AppConfig.Port); 2 3RecieveHelper.ListenStart(str => 4{ 5 try 6 { 7 //受信後の処理 8 } 9 catch (Exception e) 10 { 11 // エラー処理 12 } 13});




回答1件
あなたの回答
tips
プレビュー