序列化C#套接字

dar*_*ngs 0 c# sockets serialization

我正在寻找优化我的套接字服务器可以处理的并发连接数的选项,并且有一个想法,这个选择取决于能否序列化C#套接字,以便可以从内存中删除它们,然后根据需要进行恢复.此方案仅对我来说是可接受的,因为会话持续数小时,并且很少使用套接字发送给客户端,并且在此期间从不接收.我当前的实现是内存限制,因为我在相应客户端会话的生命周期内将每个套接字保存在内存中.同样,我的想法是,如果我能够序列化套接字并将其写入光盘或将其粘贴到分布式缓存/数据库/文件存储中,我可以释放服务器上的内存,代价是处理每个内存所需的额外时间发送(即 反序列化套接字,然后发送它).我尝试了几种选择,但每次都遇到了障碍:

  1. 通过读取和写入内存中对象的指针来序列化/反序列化套接字.我似乎无法在序列化后恢复套接字.

  2. 使用Socket.DuplicateAndClose()方法获取SocketInformation,然后序列化它,并在需要时使用SocketInformation将套接字恢复到同一进程.一旦恢复它我似乎无法使用套接字,我不确定这将节省大量内存,因为它似乎将非托管资源留在内存中.

在我看来应该有办法实现这一目标.最终,我正在寻找有人指出我正确的方向或确认它是否可能.

任何帮助是极大的赞赏!

Eug*_*its 8

这听起来像是爱丽丝梦游仙境的一个很好的延续 - 一种奇妙的无意义.您无法序列化套接字,因为这没有意义.类"套接字"(我的意思不是.NET Socket类,而是一种被称为套接字的对象)不支持"序列化"的操作,因为套接字(如果我们认为在现实世界中的对象中)不是数据容器而是大门沟通渠道.你可以制作这本书的副本,但制作一本门的纸质副本将非常困难.

现在关于记忆.您的Windows系统上可以有大约64K的套接字(我可能错误的确切数字,但这是近似的).即使每个插槽有100个字节,您也只占用6 Mb的内存.在现代服务器操作系统(Windows,Linux,您的名字)中,6 Mb的用户模式内存少于零.如果您查看整体应用程序架构,您将获得更多收益.