C# 测试网络应用程序#

C# 测试网络应用程序#,c#,networking,C#,Networking,我正在开发一个程序,将有几个用户通过p2p相互连接。我想通过在一台计算机上打开几个实例来测试运行我的程序,并让这些实例像在不同的机器上一样进行通信(即:好像它是真实的东西)。你知道怎么做吗 谢谢 PM尝试虚拟化。也就是说,使用VMWare或VirtualBox(例如),您可以在单个系统上运行各种“机器”。只需创建三个或四个虚拟机,瞧。。。您有机会运行各种实例,就好像它是真实的一样 确保使用NAT网络安装它们,为每台计算机提供自己的“内部”ip地址,然后您可以使用程序与之通信。尝试虚拟化。也就是说

我正在开发一个程序,将有几个用户通过p2p相互连接。我想通过在一台计算机上打开几个实例来测试运行我的程序,并让这些实例像在不同的机器上一样进行通信(即:好像它是真实的东西)。你知道怎么做吗

谢谢


PM

尝试虚拟化。也就是说,使用VMWare或VirtualBox(例如),您可以在单个系统上运行各种“机器”。只需创建三个或四个虚拟机,瞧。。。您有机会运行各种实例,就好像它是真实的一样


确保使用NAT网络安装它们,为每台计算机提供自己的“内部”ip地址,然后您可以使用程序与之通信。

尝试虚拟化。也就是说,使用VMWare或VirtualBox(例如),您可以在单个系统上运行各种“机器”。只需创建三个或四个虚拟机,瞧。。。您有机会运行各种实例,就好像它是真实的一样


确保使用NAT网络安装它们,为每台计算机提供自己的“内部”ip地址,然后您可以使用程序与之通信。

这样做的主要问题之一是.NET内部使用的Windows Sockets API只允许一个应用程序绑定到给定的端点(ip地址和端口)马上

为了在一台机器上支持应用程序的多个实例,您需要克服这个限制。有很多方法可以做到这一点,包括

  • 运行多个虚拟机以允许每台机器一个实例绑定到端点,就像多个真正的客户端机器一样。这是一个很好的策略,但是对于运行多个来宾操作系统和一台主机所需的资源来说,这可能会变得非常昂贵
  • 向应用程序添加对在一台计算机上运行多个实例的支持。这通常涉及使用进程间通信机制将数据传递到绑定到端点的实例
  • 让每个实例使用不同的端点,并使用UDP广播或多播,或IPC的某些其他方式来通知每个实例其他实例的绑定位置,以便它们都可以“看到”彼此
  • 在上图中,实例A首先启动,并保存正在侦听端点的套接字。当实例B启动时,它将检查另一个实例[1*],一旦发现它不是唯一的实例,它将与实例A[2*]建立IPC连接

    在发送消息时,实例B将把消息写入自身和实例a之间的IPC通道。实例B将在消息中包含一个唯一标识符,实例a使用该标识符告知消息来自哪个实例,并将包含实例B标识符的消息路由回实例

    [1*]检查第二个实例的一种方法是使用命名互斥体。启动时,应用程序应尝试获取互斥体,如果成功,则它是唯一的实例,并应绑定到侦听端点;如果获取互斥体失败,则应用程序的另一个实例正在运行,第二个实例应尝试获取一个IPC通道,实例绑定到侦听端点

    [2*]获取IPC频道的方式取决于所使用的通信机制,例如,如果您使用的是命名管道,则第一个实例将使用应用程序所有实例都知道的名称创建管道,后续实例将打开连接到该管道的管道


    这决不是一个完整的答案,但我希望它有助于

    这样做的主要问题之一是.NET内部使用的Windows Sockets API只允许一个应用程序同时绑定到给定的端点(IP地址和端口)

    为了在一台机器上支持应用程序的多个实例,您需要克服这个限制。有很多方法可以做到这一点,包括

  • 运行多个虚拟机以允许每台机器一个实例绑定到端点,就像多个真正的客户端机器一样。这是一个很好的策略,但是对于运行多个来宾操作系统和一台主机所需的资源来说,这可能会变得非常昂贵
  • 向应用程序添加对在一台计算机上运行多个实例的支持。这通常涉及使用进程间通信机制将数据传递到绑定到端点的实例
  • 让每个实例使用不同的端点,并使用UDP广播或多播,或IPC的某些其他方式来通知每个实例其他实例的绑定位置,以便它们都可以“看到”彼此
  • 在上图中,实例A首先启动,并保存正在侦听端点的套接字。当实例B启动时,它将检查另一个实例[1*],一旦发现它不是唯一的实例,它将与实例A[2*]建立IPC连接

    在发送消息时,实例B将把消息写入自身和实例a之间的IPC通道。实例B将在消息中包含一个唯一标识符,实例a使用该标识符告知消息来自哪个实例,并将包含实例B标识符的消息路由回实例

    [1*]检查第二个实例的一种方法是使用命名互斥体。启动时,应用程序应尝试获取互斥体,如果成功,则它是唯一的实例,并应绑定到侦听端点;如果获取互斥体失败,则应用程序的另一个实例正在运行,第二个实例应尝试获取一个IPC通道,实例绑定到侦听端点

    [2*]获得IPC通道的方式取决于所使用的通信机制,例如,如果您是usi