UDP socket C#.NET

本文关键字:NET socket UDP | 更新日期: 2023-09-27 18:29:54

我在.NET中使用udp套接字;特别是,我制作了一个程序,通过udp套接字将图片从图片框发送到其他程序。

这是代码:

这是套接字从端口8000 接收图像的侦听器部分

private void Listening()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Loopback, 8000);
            Socket newsock = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram, ProtocolType.Udp);
            newsock.Bind(ipep);

            int recv;
            IPEndPoint sender1 = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 6000);
            EndPoint Remote = (EndPoint)sender1;
            byte[] data = new byte[11230];

            recv = newsock.ReceiveFrom(data,ref Remote);
            MemoryStream x = new MemoryStream(data);
            Image y = Image.FromStream(x);
            pictureBox2.Image = y;
         }

这是socket发送图像的发送部分[代码]

private void Sending()
        {
            IPAddress host = IPAddress.Parse("127.0.0.1");
            IPEndPoint hostep = new IPEndPoint(host, 8000);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,    ProtocolType.Udp);
            sock.Connect(hostep);

            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            sock.Send(ms.ToArray());
          }

两个部件都在同一台电脑中。

我的问题是,当它在"发送"部分被称为"发送"功能时,它会生成异常,并显示以下消息:

在数据报套接字上发送的消息的大小大于内部消息缓冲区或其他网络限制,或者数据报的接收缓冲区的大小低于数据报本身的大小。

感谢您抽出时间

UDP socket C#.NET

我建议您不要使用当前的方法。你试图实现的目标并不是那么简单就能以稳健的方式实现的。我建议您查看优秀的zeromq库,它很好地封装了原始套接字api,并提供了许多特定的模式来发送和接收数据。

对于您正在描述的问题,zeromq支持的"发布/订阅"模式可能非常适合。

Zeromq是一个跨平台的c库,但它有很好的CLR/.NET包装器http://www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction

错误消息非常狭窄:您超出了消息大小的限制。在UDP中,您发送数据报,而不是字节流。在IPv4中,您不能发送大于65507字节的UDP数据报(即64KiB,包括IPv4和UDP标头)。

UDP非常适合传递短消息,但对于传输大量数据,TCP更可取。