如何通过它们传播的客户端应用程序实例对套接字连接进行分组?

Cas*_*roy 5 c# sockets architecture tcp

最近,我一直致力于一个由TCP 客户端 - 服务器模型 (反向连接)利用的应用程序.

为了提高长时间运行的性能,我已经做到了这一点,以便客户端应用程序的单个实例可以与服务器建立多个传出套接字连接.

当服务器应用程序接受传入连接时,表示该连接的子套接字将封装在名为a的类的新实例中ServerChildSocket.

我需要一些方法来有效地组合ServerChildSocket从同一客户端应用程序实例传播的所有实例,但我正在努力开发一种工作方法,更不用说一个好的方法了.

我的目标是ServerChildSocket在类似于此类的类中对实例进行分组...

class UserState
{
     ServerChildSocket MainConnection {get; set;}
     ServerChildSocket FileDownloadConnection {get; set;}
     ServerChildSocket VoiceChatConnection {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

如何识别源自同一客户端应用程序实例的连接,然后将连接分配给UserState该类的实例?


我相信客户端应用程序需要在建立连接后立即发送有关连接意图(主连接?下载连接等等)的一些初步信息.不过,我正在努力想办法将这一切融合在一起.

Jon*_*Jon 7

包括从服务器向协议中的每个客户端分配"客户端ID",以及根据其预期用途标记每个连接的想法.

当客户端与服务器建立主连接时,握手的相关部分将如下所示:

             CLIENT                          SERVER

           Type = Main    =============>
           Id   = null

                          <=============    Id = 123
Run Code Online (Sandbox Code Playgroud)

然后,当客户端进行额外的侧通道连接时,它将包括服务器在初始握手中返回的id:

             CLIENT                          SERVER

           Type = Chat    =============>
           Id   = 123
Run Code Online (Sandbox Code Playgroud)

这样,服务器知道每个接受的连接属于哪个客户端,并且也没有意外冲突的危险(服务器不会将相同的id分配给多个客户端).最后,您可以根据需要将id设置为大且不可预测,以防止客户欺骗彼此的旁道连接.

  • 一个安全生成的随机Guid就像ID一样好.并且服务器必须确保发送的ID实际已注册. (2认同)