Tag: 网络编程

如何保护ZeroMQ请求回复模式以防止潜在的消息丢失?

我正在尝试在c#应用程序和分布式python服务器之间的TCP层上实现ZeroMQ模式。 我有一个使用请求 – 回复REQ/REP模式的版本,在localhost测试时看起来相对稳定。 但是,在测试中,我调试了一些情况,我在收到回复之前意外地发送了多个请求,这显然是不可接受的。 在实践中,网络可能会有大量丢弃的数据包,我怀疑我将丢弃大量的回复和/或无法发送请求。 1)有没有办法重置REQ/REP请求 – 回复套接字 之间的连接 ? REOUTER/DEALER模式会更有意义吗? 由于这是我第一次使用ZeroMQ,我希望保持简单。 2)是否有一个良好的ZeroMQ机制来处理连接事件? 我一直在阅读“指南”,有一些关于监控连接的提及,但没有例子。 我找到了ZMonitor ,但无法在c#中触发事件。

如何从服务器上正常关闭套接字

在服务器端,我正在尝试优雅地关闭连接的套接字。 我知道Socket上正确的事件序列应该是: socket使用SocketShutdown.Send选项关闭 loop / wait直到套接字Receive返回0字节 套接字关闭 我有几个问题: 如果Socket.Receive永远不会返回(0字节)怎么办? 我们会不会试图永远关闭套接字? 每当我在服务器上调用Close时,客户端总是会收到“现有连接被远程主机强行关闭”的exception。 我怎样才能让客户通知这个关闭“优雅”? 在服务器上,如果我正在使用Async Begin / EndReceive调用,每当我在套接字上调用Close时,它总是会在Begin / EndReceive线程上导致ObjectDisposedException。 如果没有发生此exception,是否无法关闭套接字?

如何为测试目的模拟网络故障(在C#中)?

我正在构建一个可以称为DAL的新应用程序。 不幸的是,与数据库的网络连接是一个真正的问题。 我希望能够在我的测试范围内暂时阻止网络访问,以便我可以确保我的DAL在这些情况下按预期运行。 更新:有许多手动方式来禁用网络,但如果我可以在测试本身内启用/禁用它肯定会很好。

从网络驱动器C#连接/复制

不完全确定如何处理这个问题。 我已经研究了一下,但我已经做得很短。 尝试连接到工作中的网络驱动器并复制出最新的文件夹(更新到项目)对我来说,目录开始为\但当我将其添加到字符串变量时,它将无法连接,并且当我不会显示试图检查它。 这是一个过程吗? 这就是我所拥有的。 而且在某种程度上它必须是错误的。 string updir = @”\\NetworkDrive\updates\xxxxx”; public void CopyAll(DirectoryInfo source, DirectoryInfo target) { try { //check if the target directory exists if (Directory.Exists(target.FullName) == false) { Directory.CreateDirectory(target.FullName); } //copy all the files into the new directory foreach (FileInfo fi in source.GetFiles()) { fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true); } //copy all the sub directories […]

C#游戏网络库

我正在使用.Net v2开发一款在线策略游戏。 虽然游戏主要是战略性的,但它确实有一些需要合理网络性能的战术元素。 我打算将TCP数据包用于战略数据,将UDP数据包用于战术数据。 {编辑}我忘了提到我偏离WCF和.NET 3+有几个原因。 首先,因为我想保持我的下载量小,我的大多数客户已经拥有.NET 2.0。 其次,因为我希望能够选择移植到Mac和Linux,并且不确定Mono中的WCF可用性。 {/编辑} 我正在寻找网络库的建议。 我找到了一些选项,例如GarageGames的扭矩网络库(C ++),RakNet(C ++)和lidgren网络库(C#): http://www.opentnl.org/ http://www.jenkinssoftware.com/ http://code.google.com/p/lidgren-network/ 有没有人对这些或其他图书馆有实际经验? 我只是偶然发现了RakNetDotNet: http://code.google.com/p/raknetdotnet/ 这可能是我正在寻找的……

蓝牙在2台Windows 7计算机上使用C#进行配对而不进行配对

我已经读过,在通过蓝牙进行通信之前必须进行配对,但我想知道, 我是否可以创建一个应用程序来读取由另一个蓝牙应用程序广播但未配对的文本。 因为我们可以看到设备周围其他蓝牙设备的名称。 因此,我们不能将我们的蓝牙无线电设置为可以读取任何蓝牙播放文本消息的状态。 示例:android中有createInsecureRfcommSocketToServiceRecord() & listenUsingInsecureRfcommWithServiceRecord()但是在C#中没有这样的窗口吗? 谢谢 我的终极目标 🙂 正在创建一个在Windows 7 PC上运行的应用程序,它可以创建即时蓝牙网络,用于对等文件传输和聊天 脚本 有一群人,每个人在每台计算机上都有这个应用程序,其中一个人希望与其他人分享文件(可能是电子书,PDF或任何东西)。 他在他的应用程序配置中设置了他的网络“net”(或任何其他名称),而其他人也在每个应用程序上添加了相同的名称。 最后,每个用户都可以在他们的应用程序显示中看到他们周围的其他蓝牙节点的列表,配置为相同的网络名称“net”。 所以每个人都可以将文件发送到同一网络中的选定节点。 设计 每个用户只 打开蓝牙无线电 ,然后在应用程序中输入所需的网络名称 PC上的每个应用程序将通过临时创建的连接( 无需配对或用户参与 )迭代地与可访问的蓝牙设备通信,检查其网络名称并列出具有类似网络名称的可发现PC 然后他们将彼此共享这些列表,因此一台PC知道同一网络中的计算机,即使它们不在范围内。 通过算法解析的路径将文件从一台计算机发送到一台或多台计算机,甚至发送聊天文本。 所有这一切都将通过在每个应用程序之间建立的简单临时蓝牙连接来实现,除了网络名称之外不需要配对或认证。 (因为我不知道如何使用C#创建Piconets,或者如何创建蓝牙路由协议。 没有实施其他安全措施。 请让我知道任何其他更好的设计或方式。 非常感谢你阅读冗长的文字。 还包括任何有用的代码,可以帮助我实现上述目标。

处理基于线路的网络I / O流的好方法是什么?

注意:让我为这个问题的长度道歉,我不得不把很多信息都写进去。 我希望这不会导致太多人简单地浏览它并做出假设。 请完整阅读。 谢谢。 我有一个通过套接字进入的数据流。 这些数据是面向行的。 我正在使用.NET的APM(异步编程方法)(BeginRead等)。 这排除了使用基于流的I / O,因为异步I / O是基于缓冲区的。 可以重新打包数据并将其发送到流,例如内存流,但也存在问题。 问题是我的输入流(我无法控制)不会向我提供有关流的长度的任何信息。 它只是一个看起来像这样的换行符流: COMMAND\n …Unpredictable number of lines of data…\n END COMMAND\n ….repeat…. 因此,使用APM,并且因为我不知道任何给定数据集将持续多长时间,很可能数据块将跨越需要多次读取的缓冲区边界,但这些多次读取也将跨越多个数据块。 例: Byte buffer[1024] = “……………..blah\nThis is another l” [another read] “ine\n………………………..More Lines…” 我的第一个想法是使用StringBuilder并简单地将缓冲线附加到SB。 这在某种程度上起作用,但我发现很难提取数据块。 我尝试使用StringReader来读取新的数据但是无法知道你是否得到一个完整的行,因为StringReader在最后一个块的末尾返回一个部分行,然后返回null。 没有办法知道返回的内容是否是完整的新行数据。 例: // Note: no newline at the end StringBuilder sb = new StringBuilder(“This […]

如何在.NET中重用socket?

我试图重新连接到我已断开连接的套接字但由于某种原因它不会允许它,即使我调用Disconnect方法并将参数“reuseSocket”设置为true。 _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Connect(ipAddress, port); //…receive data _socket.Disconnect(true); //reuseSocket = true //…wait _socket.Connect(ipAddress, port); //throws an InvalidOperationException: 套接字断开连接后,您只能异步重新连接,并且只能连接到不同的EndPoint。 必须在线程上调用BeginConnect,该线程在操作完成之前不会退出。 我究竟做错了什么?

如何在.NET中创建虚拟网络适配器?

我想在运行时(通过代码)创建/添加虚拟网络适配器到客户端操作系统,最好是在C#中。 类似于VirtualBox / VMware / Himachi在安装软件时创建的内容。 我猜这将需要一些C / C ++恶作剧用于驱动程序集成,但如果它只用于C#,那就更好了。 我知道OpenVPN,他们的东西主要是在C中,我也知道TUN / TAP驱动程序浮动,我只是不知道这些是否是唯一的解决方案,不需要我为Windows创建一个满载的网络驱动程序。

是否可以使用WCF发现来公开使用命名管道的WCF端点?

我有一个使用发现的应用程序,可以在本地部署在同一台PC上或远离它所使用的服务。 有没有办法通过WCF发现公开命名管道绑定? 如果不是,我想我可以在发现服务后进行协商,以确定最合适的绑定。