【问题标题】:UDP socket C#.NETUDP 套接字 C#.NET
【发布时间】:2013-09-01 22:47:50
【问题描述】:

我在 .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。严重地。除非你真的知道你需要 UDP,否则不要使用它。
  • 错误信息非常明确:您尝试发送的数据量对于 UDP 来说太大。除此之外,您的代码中还有很多问题,所以 +1 @JonathonReinhart 所说的。
  • @dtb 除了选择 UDP 而不是 TCP,有什么错误?

标签: c# sockets tcp udp


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 嗨,这是一个例子,但实际上我必须从网络摄像头发送帧。如何制作发送部分?我不会使用 TCP,因为它很慢而且不适合这个范围
  • @alessiovinaccia 哦……这是一个流媒体网络摄像头提要。看,这是您应该从一开始就提供的令人难以置信的信息。在这种情况下,答案很简单:使用RTP
  • 我有 3 个问题要问你: 1)据我了解,UDP 协议不允许数据包分段,因此存在长度限制,因为数据包是一次发送的,而 TCP 允许碎片化,没有长度限制。对吗? 2)我在哪里下载 RTP C# 库? 3)我阅读了有关 RTP 的文档,它说 RTP 对数据包有各种控制(排序、错误...)。我的问题是:为什么它具有与它使用的 tcp 相同的控制
  • UDP协议?是什么原因?
  • @alessiovinaccia:UDP 数据包可以分段。 IP 数据包的通常最大大小为 1500 字节左右。
猜你喜欢
  • 2015-12-14
  • 2018-04-03
  • 2017-10-28
  • 2011-02-15
  • 2012-01-30
  • 2010-12-22
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多