0

我在 .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;

         }

这是套接字发送图像的发送部分[代码]

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());

          }

两个部分都在同一台 PC 中。

我的问题是,当它在“发送”部分被称为“发送”函数时,它会生成以下消息的异常:

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

谢谢你的时间

4

2 回答 2

1

我会建议你反对你目前的做法。您试图实现的目标并不是以稳健的方式完成的那么简单。我建议您查看出色的 zeromq 库,该库很好地封装了原始套接字 api,并提供了许多特定的模式来发送和接收数据。

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

Zeromq 是一个跨平台的 c 库,但可以使用良好的 CLR/.NET 包装器。我敦促您阅读这篇文章作为介绍: http: //www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction

于 2013-09-01T23:19:10.217 回答
0

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

UDP 适合传输短消息,但传输大量数据 TCP 更可取。

于 2013-09-01T22:55:36.813 回答