質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Q&A

解決済

1回答

5897閲覧

UDPで画像を分割して送りたいのですが、なぜかおくれません

kiritsugu

総合スコア127

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

0グッド

0クリップ

投稿2017/01/23 09:13

C#で画面を撮ったものをUDPプロトコルを使って送りたいのですがなぜかおくれません。

c#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Net; 11using System.Net.Sockets; 12using System.IO; 13 14namespace ControlClient 15{ 16 public partial class Form1 : Form 17 { 18 private Timer ScreenShot { get; set; } 19 20 public Form1() 21 { 22 InitializeComponent(); 23 24 this.ScreenShot = new Timer() 25 { 26 Interval = 500, 27 }; 28 this.ScreenShot.Tick += (sender, e) => 29 { 30 this.SendImage(); 31 }; 32 this.ScreenShot.Start(); 33 } 34 35 public async void SendImage() 36 { 37 // サーバーに対して 38 IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.1.59"), 8000); 39 byte[] imgbyte = ScreenCapture.CaptureBitmap(); 40 List<byte> bytelist = new List<byte>(); 41 int cnt = 0; 42 43 for (; cnt<imgbyte.Length; cnt++) 44 { 45 if(imgbyte.Length - cnt < 1300) 46 { 47 using (var client = new UdpClient(8001)) 48 { 49 client.Connect(remote); 50 byte[] remain = imgbyte.Skip(cnt).Take(imgbyte.Length - cnt).ToArray(); 51 await client.SendAsync(remain, remain.Length); 52 } 53 using (var client = new UdpClient(8001)) 54 { 55 client.Connect(remote); 56 byte[] end = Encoding.UTF8.GetBytes("end"); 57 await client.SendAsync(end, end.Length); 58 } 59 } 60 61 if (imgbyte.Length % 1300 == 0 && cnt != 0) 62 { 63 using (var client = new UdpClient(8001)) 64 { 65 client.Connect(remote); 66 await client.SendAsync(imgbyte, imgbyte.Length); 67 } 68 bytelist = new List<byte>(); 69 return; 70 } 71 else 72 { 73 bytelist.Add(imgbyte[cnt]); 74 } 75 } 76 } 77 } 78 79 // 画面をとりbyte配列にして返す 80 static class ScreenCapture 81 { 82 public static byte[] CaptureBitmap() 83 { 84 byte[] byteimage; 85 Bitmap bm = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 86 87 using (var mms = new MemoryStream()) 88 { 89 using (var graphics = Graphics.FromImage(bm)) 90 { 91 graphics.CopyFromScreen(new Point(0, 0), new Point(0, 0), bm.Size); 92 bm.Save(mms, System.Drawing.Imaging.ImageFormat.Jpeg); 93 byteimage = mms.GetBuffer(); 94 } 95 96 mms.Close(); 97 } 98 99 return byteimage; 100 } 101 } 102} 103 104

実行した際にこのような例外が発生するのですが、

SocketException (0x80004005): 通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。

べつに同じポート使ってるわけじゃないし、一回送ったらdisposeでリソース開放してると思うんですがなんで送れないんでしょうか
またぜんぜん送れないわけではなく最初の3回くらいは成功してるんです。
またどうすればエラーが起こらないように送れるようになりますか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
Tickイベントで時間を指定して繰り返し送信する処理を記述しているので、
「前の送信が未だ途中なのに次の処理がUdp接続をオープンしようとして、ソケットの使用中例外が発生」だと思います。
改善するなら、「タイマの使用を取り止めて、非同期メソッド内で無限に繰り返し」でしょうか。

csharp

1public async Task SendImage() 2{ 3 while (true) 4 { 5 await Task.Delay(500); 500ミリ秒待機 6 7 // 以下永遠に繰り返し... 8

投稿2017/01/23 09:24

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiritsugu

2017/01/23 10:12

回答ありがとうございます! タイマ使わずそのようにやってみましたが、なぜか同じエラーがおきます。
kiritsugu

2017/01/23 10:35

すみません、それに伴いコードを一部修正する必要があったのですが、気づいておらず修正していませんでした。修正したらちゃんと動きました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問