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

时间:2013-09-26 17:34:13

标签: c# sockets architecture tcp

最近,我一直在开发一个由TCP client-server modelreverse connection)利用的应用程序。

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

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

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

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

class UserState
{
     ServerChildSocket MainConnection {get; set;}
     ServerChildSocket FileDownloadConnection {get; set;}
     ServerChildSocket VoiceChatConnection {get; set;}
}

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


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

2 个答案:

答案 0 :(得分:7)

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

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

             CLIENT                          SERVER

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

                          <=============    Id = 123

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

             CLIENT                          SERVER

           Type = Chat    =============>
           Id   = 123

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

答案 1 :(得分:2)

您正在寻求的是服务器端会话管理 可以看到架构路线图的描述,在Web服务器中的实现hear

Stan Kirk 提供了一个名为C# SocketAsyncEventArgs High Performance Socket Code的高级帖子,通过会话ID处理UserToken确认。

我认为将Stan Kirk的实现结合起来创建session-id并将其存储在并发哈希映射中,如ConcurrentDictionary(TKey as session-id,TValue as UserState)将帮助你。