【问题标题】:Multiplexing data over socket通过套接字多路复用数据
【发布时间】:2012-12-28 20:00:40
【问题描述】:

基本上,我试图从同一个套接字BUT同时进行 2-3 个文件传输,但不会中断发送回客户端/服务器的消息。 p>

类似于 2 个人和 3 个文件传输之间的聊天程序。

我试图避免打开 2 个或更多流。

我希望一切都异步发生 - 仍然同时同时传输所有 3 个文件;不是一个接一个。

我的协议会是什么样子?我想不出来。

【问题讨论】:

  • 许多允许多个聊天和/或多个文件传输的客户端-服务器系统对每个聊天/传输使用单独的连接。这样比自己对连接进行分组交换要容易得多
  • 是的,我很清楚这一点,但我自己专门要求进行数据包交换。知道我该怎么做吗?

标签: c++ sockets networking protocols multiplexing


【解决方案1】:

如果你真的想自己做数据包交换,我推荐一个队列:将需要发送的数据包放在一端,另一端取数据包并进行实际的电汇。

对于通过网络传输的数据包,您需要一个类型(文件传输或聊天)、一个目的地(将文件放在哪里,或与谁聊天)以及实际的数据包数据。

在接收方,您需要跟踪所有收件人、聊天和文件传输。当接收到目的地 X 的文件传输时,将其保存到文件 X,如果您收到 Y 的聊天消息,则将消息发送给 Y。

【讨论】:

  • 但是您如何确定哪个数据包用于哪个文件?然后,您将不得不在每个块中继续发送文件路径,这会导致大量开销。
  • @amaninlove 现在这是前一段时间了,所以有些细节有点模糊,但我想我的意思是多路复用不同的类型消息。这意味着您一次只能激活一个文件传输,但它的包可以与其他类型的包(例如字符消息)多路复用。
  • 我明白你的意思。通过这种方法,它会影响下载速度吗?例如,多个文件通过单个套接字或每个文件不同的套接字多路复用哪个更快?
  • @amaninlove 你仍然需要多路复用。通过单个套接字上的多个文件,或通过每个文件的多个套接字。考虑到它允许每个套接字由单独的线程或进程处理,多套接字解决方案可以更好地扩展(当然是限制)。如果所有插槽都用于同一个旧式旋转盘片硬盘驱动器上的文件,您可能仍然会遇到瓶颈(对于 SSD 来说问题较小)。
  • @amaninlove 您需要容器中的某种结构来跟踪所有连接。如果您只是在单个进程中使用单个线程,那么在单个套接字上进行多路复用可能会更有效。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多