Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要每50毫秒发送一个映像,我应该使用TCP还是UDP?_C#_Image_Tcp_Udp - Fatal编程技术网

C# 要每50毫秒发送一个映像,我应该使用TCP还是UDP?

C# 要每50毫秒发送一个映像,我应该使用TCP还是UDP?,c#,image,tcp,udp,C#,Image,Tcp,Udp,我正在使用服务器-客户机模型构建一个C#应用程序,其中服务器每50毫秒通过一个套接字向客户机发送一个图像(100kb) 我使用的是TCP,但是除了这个协议的开销之外,有时候客户端在套接字上有多个映像。我还没有想到一个聪明的机制来分割每个图像的字节(实际上,我只需要最新的一个) 我尝试使用UDP,但得出的结论是,我不能发送100kb的DGram,只能发送64kb的DGram。即使如此,我也不应该使用超过1500字节;否则,数据包将沿网络分割,丢失部分数据包的机会将更大 所以现在我有点困惑。我是否应

我正在使用服务器-客户机模型构建一个C#应用程序,其中服务器每50毫秒通过一个套接字向客户机发送一个图像(100kb)

我使用的是TCP,但是除了这个协议的开销之外,有时候客户端在套接字上有多个映像。我还没有想到一个聪明的机制来分割每个图像的字节(实际上,我只需要最新的一个)

我尝试使用UDP,但得出的结论是,我不能发送100kb的DGram,只能发送64kb的DGram。即使如此,我也不应该使用超过1500字节;否则,数据包将沿网络分割,丢失部分数据包的机会将更大

所以现在我有点困惑。我是否应该继续使用TCP并在每个映像的末尾放入一些转义字节,以便客户端可以将它们分开?或者我应该使用UDP,发送1500字节的DGRAM,并提出一种排序和恢复机制

这里的关键目标是非常快速地传输图像。我不介意在途中丢失一些,只要客户继续收到新的


或者我应该使用另一个协议?提前谢谢

> P>您应该考虑使用实时传输协议(AKA)。

RTP使用的底层IP协议是UDP,但它有额外的分层来指示时间戳、序列顺序等

RTP是VoIP和IP视频系统使用的主要媒体传输协议。如果您找不到该协议的现有C#实现,我会非常惊讶


此外,如果您的图像文件是JPEG格式,您应该能够生成RTP/MJPEG流。有相当多的视频观众已经具备了接收和显示此类流的本机支持,因为一些IP网络摄像头以这种格式输出。

如果最新的视频比每一张图片都重要,UDP应该是您的首选

但是如果你要处理大于64K的帧,你必须做一些形式的自我重构。不要担心支离破碎的帧,因为您必须处理它,否则较低的层会。你只想要完整的照片


您需要的是带有时间戳/序列的某种形式的封装

我建议在以下情况下使用UDP:

  • 您的应用程序可以处理无法通过的图像或小图像突发
  • 您可以将图像压缩为65535字节
如果您正在实现视频会议应用程序,那么值得注意的是,大多数应用程序都使用UDP

否则,您应该使用TCP并实现一种方法来分隔图像。在这方面的一个建议是看看议定书。它专门设计用于承载实时数据,如VoIP和视频


编辑:在过去,我已经环顾了好几次.Net RTP库,除了非.Net库或半完成库的包装器之外,我没有太多的成功。我刚刚又快速看了一眼,这可能是其中一个看起来更有希望的部分。

首先,无论您做什么,您的网络都可能无法处理此问题,但我会选择UDP。您可以尝试将图像分割为较小的位,并且仅在下一个图像到达之前获得所有部分时才显示每个图像


另外,您也可以像其他人提到的那样使用RTP,或者尝试一下。它是UDP之上的一个相当轻量级的可靠层。它应该比TCP更快。

其他答案包括好的选项:UDP或RTP之类的“真实”协议


然而,如果您想坚持使用TCP,只需构建一个简单的“消息”结构来满足您的需求。最简单的?长度前缀。首先,将图像的长度发送为4字节,然后发送图像本身。编写客户机和服务器非常简单。

我同意这是通过TCP构建此数据的方式,但这与新的最佳想法背道而驰。因此,真的不希望因为失去了旧的东西而拖延新的东西。