在C#中建立P2P连接

8
我知道这个问题与其他一些问题相似, 不同, 我认为我的情况足够特殊,需要提出自己的问题(希望如此)。
我的计划是在另一个人的计算机上部署程序,在此之后,我假设计算机应该能够彼此通信。一旦程序启动,它应该能够获取地址信息和端口(如果它们没有被阻止),以创建连接,对吗?
更重要的是我所在宿舍的互联网配置。每个房间都分配了一个唯一的端口和由DHCP服务器分配的静态IP地址。我该如何将其纳入我的程序设计中?
我认为这种设置不需要服务器作为中间访问点,因为我的地址详细信息将始终保持不变,主机计算机可以直接连接到我的计算机而无需进一步信息。这正确吗?

最后,我阅读了有关创建连接的几页内容,但对于TcpConnection、WCF、CORBA等所有可能性感到困惑。假设我只想向另一台机器发送消息,哪一个实际上对我来说是最简单的呢?

更新:

地址是静态的,这意味着它不会改变。我的IP地址的格式为130.83.20.xxx,我可以等待DHCP服务器分配给我这个地址,也可以使用静态IP配置手动输入它。

至于消息本身,对于开始而言,简单的文本消息就足够了。之前提到的端口是交换机端口,在网络编程中似乎没有用。


为了指导您,我们需要了解更多关于您的目标的信息。根据您需要发送的数据的性质,TcpConnection可能很好,但也许一个简单的WCF服务会更好。当您说每个房间都分配了一个端口和静态IP时,我并不明白您的意思...您是指物理端口吗?如果是的话,在网络编程中它并不起作用。然而,TCP/UDP端口是重要的。您需要知道哪些端口可供使用。 - Nate
@Nate:感谢你提醒。目前,我只想在朋友的电脑上测试这个程序,我认为像“你好,你怎么样?”这样的简单文本消息应该没问题。例如,我的IP地址是130.83.20.103或类似的东西。它不会改变。DHCP服务器分配给我这个地址,或者我可以手动输入它。每个房间都有一个端口,中央IT管理部门可以阻止它们。我相信这些是交换机端口。 - IAE
如果DHCP服务器可以分配给您IP地址130.83.20.103,那么您不应手动配置自己以获得该IP地址。如果您这样做了,而DHCP服务器将该地址分配给其他人,则会导致IP地址冲突,并对通过DHCP服务器获得该IP地址的可怜家伙造成拒绝服务攻击。 - Justin
@Kragen:这里的网络设计是每个房间,或者说每台电脑都有一个独特的IP地址,不会被分配给其他房间。 - IAE
1个回答

7

我会选择使用 TcpClientTcpListener。可以在 MSDN 上查看示例代码,将其复制粘贴到两个 C# 控制台项目中并构建它们。

我会在测试时使用 127.0.0.1(本地主机)和端口 5001(通常用于测试的端口)。

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001); 

然后,您应该能够测试在您的计算机上运行的简单客户端/服务器。一旦您使其正常工作,您可以将客户端带到宿舍中的另一台计算机上,并确保它仍然能够正常工作。一旦这样做成功,您可以带着客户端前往本地咖啡店。在此情况下,请让服务器绑定到您实际的外部IP(而不是localhost),并将其留在宿舍的已知IP地址上运行。您可以通过TcpListener构造函数中指定一个端口来实现这一点。

TcpListener server = new TcpListener(5001);

一旦您自己或与朋友合作完成所有工作,然后将其发送到外部。最好在将其发送给客户并与他一起进行故障排除之前,在演示中使这些内容正常工作。 :)

我的答案背后的推理:

简单的TCP客户端/服务器非常直观,可以在两台计算机之间实现简单的聊天程序。然后,您可以将其升级以发送任何数据流。您可以添加此类代码以访问StreamWriter:

NetworkStream stream = client.GetStream( );
StreamWriter writer = new StreamWriter(stream);

2
传输大文件有限制吗? - whihathac
1
不完全是这样。您只需在服务器和客户端类中实现上传/下载方法,并在这些方法中将数据块流式传输到文件中。因此,您不会一次发送所有数据。只需每次发送1K或更多即可。如果要实现确认、数据完整性验证等,则可以在此时进入协议设计。但在基本级别上,您只需从网络流中读取并写入文件流,反之亦然。没有限制(除了可能是文件流的限制,例如FAT32文件系统的4GB文件大小限制)。 - mattypiper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接