当前位置: 首页 > 编程语言 > C#

C#SocketsandPipes分享

时间:2023-04-10 16:37:29 C#

C#SocketsandPipes目前我正在Windows上开发一个多进程的桌面应用程序。此应用程序将是一个压缩包装的应用程序,将部署在世界各地的客户端计算机上。虽然我们可以对机器有广泛的规范-例如带有.Net4.0CF的WindowsXPSP3,但我们无法控制它们,我们不能对它们的配置过于具体-例如我们不能指定机器必须具有cuda1.4图形处理器,等等其中一些进程是托管的(.Net4.0),其他进程是非托管的(C++Win32)。这些过程需要共享数据。到目前为止,我评估过的选项是看起来好一点的管道,但对于我们的需求来说——两者的性能都是可以接受的。套接字使我们能够灵活地跨机器(和操作系统——我们最终支持非Microsoft操作系统)边界,因此我们倾向于使用套接字。但是-我主要担心的是-如果我们使用Tcp套接字-我们会遇到防火墙问题吗?是否有其他人部署了使用TCP进行IPC的桌面应用程序/程序并遇到了问题?如果是这样-什么样的?我知道这是一个相当开放的问题,我很乐意重新措辞。但我真的很想知道我们可能会遇到什么样的潜在问题。编辑:为了让它更容易——我们只提供一些POD、整数、浮点数和字符串。我们构建了一个提供两种范例的抽象层——请求/响应和订阅。传输层已经被抽象出来,目前我们有两种实现——基于管道和基于TCP。管道通常在快速LAN上表现更好,但TCP通常在较慢的网络或WAN上表现更好。看下面的msdn点。TPC更容易配置。关于防火墙,它们允许您打开/关闭通信端口。如果这不是一个选项或问题,另一个选项是http(REST/json、web服务、xmlrpc等等),但不确定http开销是否可以接受。确保使用真实世界的数据集进行尝试(在测试中传递琐碎的数据会使开销看起来不合理——与真实世界的数据集相比通常很小)。来自msdn的一些附加信息:在快速局域网(LAN)环境中,传输控制协议/Internet协议(TCP/IP)套接字和命名管道客户端的性能相当。但是,TCP/IP套接字和命名管道客户端之间的性能差异在较慢的网络上变得很明显,例如跨广域网(WAN)或拨号网络。这是因为进程间通信(IPC)机制以不同方式在对等点之间进行通信。使用命名管道,网络通信通常更具交互性。在另一个对等点使用读取命令请求数据之前,对等点不会发送数据。网络读取通常涉及在开始读取数据之前查看管道消息的序列。这在慢速网络上可能非常昂贵,并导致过多的网络流量,进而影响其他网络客户端。弄清楚您是在谈论本地管道还是网络管道也很重要。如果服务器应用程序在运行Microsoft?SQLServer?2000实例的计算机上本地运行,则可以选择本地命名管道协议。本机命名管道在内核模式下运行并且速度非常快。对于TCP/IP套接字,数据传输更加简化并且开销更少。数据传输还可以利用TCP/IP套接字性能增强机制,例如开窗、延迟确认等,这在慢速网络中非常有用。根据应用程序的类型,这种性能差异可能很大。TCP/IP套接字还支持积压队列,与命名管道相比,它可以提供有限的平滑,这可能会在您尝试连接到SQLServer时导致管道繁忙错误。通常,在慢速LAN、WAN或拨号网络上首选套接字,而当网络速度不是问题时,命名管道可能是更好的选择,因为它提供了更多的功能、易用性和配置选项。有关TCP/IP的更多信息,请参阅MicrosoftWindowsNT?文档。如果您需要模拟命名管道客户端的安全凭证,实际上只有一个选项:)并且命名管道还有更好的名称(尽管也可以为TCP端口提供DNSSRV记录)。否则,没有太大区别。两者都将数据视为字节流,让您自己寻找消息边界。命名管道有一个额外的选项来为您保留消息边界,但请注意,您必须在消息模式下创建管道并同时显式设置读取模式。如果我正确理解您的要求,您需要在同一台计算机上运行的进程之间进行通信。这些进程可以在与交互式登录用户相同的安全上下文下运行。在这种情况下,我应该提及解决方案的不同方面。一个问题是在应用程序之间共享数据。另一个问题是协议,它定义了如何访问和修改公共数据以及进程之间如何通信。例如,您可以有一个进程提供数据,另一个进程订阅数据。另一种情况:您可以拥有所有应用程序都可以读取或修改的公共数据,您只需要确保没有人同时修改共享数据,或者没有人在另一次修改期间访问数据。原因可能是许多其他不同的通信场景。鉴于这方面,我建议您不要在问题中包括其他两个选项:这两个选项都在.NET和非托管C++中得到了很好的实现。从性能的角度来看,使用内存映射文件是最好的方法。如果您创建的视图不会与某些物理文件相关联,那么您将只有可以在进程之间使用的公共内存。您还可以使用互斥锁或事件来控制多个应用程序不会同时使用内存。在最简单的情况下,您甚至可以在C++中使用#pragmadata_seg将一些数据放入DLL的命名部分,并使用/SECTION选项(如/SECTION:.MYSEC,RWS)共享数据。您可以在所有.NET应用程序和所有非托管C++应用程序中使用DLL来访问公共数据。通过这种方式,您可以轻松访问公共数据。如果您需要一些更复杂的通信场景,那么在C++/.NET中使用COM接口的方法可能是最好的选择。如果我建议您逐步阅读描述如何使用COM接口在.NET中实现主互操作程序集并在.NET和C++COM中使用它进行通信的文章。以上就是C#学习教程:C#套接字与管道分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: