具有多个逻辑数据流的单套接字连接(区分数据包)

Posted

技术标签:

【中文标题】具有多个逻辑数据流的单套接字连接(区分数据包)【英文标题】:Single socket connection with multiple logical data streams (differentiating packets) 【发布时间】:2012-03-28 12:46:30 【问题描述】:

我正在使用 Windows 套接字在 C++ 中编写程序,我想要一个套接字,但能够从不同的线程发送数据并区分服务器端哪个线程发送数据,因为它们具有不同的应用程序。本质上是使用单个套接字连接的逻辑数据流。我很难找到区分数据包服务器端的方法。我能想到的最好的方法是用几个字节开始每个数据包,指示哪个线程发送了它。有没有更好的方法来做到这一点?

类似于How to use single port for multiple logical data streams (Winsock)?,但我一直在区分数据包。

【问题讨论】:

【参考方案1】:

你最好的选择(我认为)是为每个任务关联一个唯一的 id,创建一个处理网络的单个线程,并(如你所说)将 task-id 添加到数据包中。

在接收端你也这样做:一个线程读取数据包并根据任务 ID 分发它们的内容。

【讨论】:

【参考方案2】:

如果所谓的数据包不是服务器知道的所有固定长度,您还需要一个数据包开始或结束位置的指示。

【讨论】:

以上是关于具有多个逻辑数据流的单套接字连接(区分数据包)的主要内容,如果未能解决你的问题,请参考以下文章

什么是套接字(Socket)

当没有数据要读取时,读取套接字会给出 errno EAGAIN,而且如果我断开网络连接

TCP下的套接字编程

CFReadStreamRead 读取时如何区分数据包?

递归处理来自套接字的数据?

Socket(套接字) IP TCP UDP HTTP