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回くらいは成功してるんです。
またどうすればエラーが起こらないように送れるようになりますか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/23 10:12
2017/01/23 10:35