将tcp连接作为参数传递给不同的计算机

时间:2011-09-04 04:30:52

标签: c# networking networkstream

我一直在努力学习TCP协议。所以我能够在同一网络上的两台计算机之间传输数据:

\\the server:

var server = new TcpListener(ipAddress, port); //create a server
server.Start(); //start the server

//wait here until a client get's connected to this computer
TcpClient someClient = server.AcceptTcpClient();

NetworkStream stream = someClient.GetStream(); \\create a network stream object in order to read and send data to the other connected computer

一旦服务器运行,客户端应用程序将能够以:

连接到服务器
//Client:
var client = new TcpClient(serverIP, port);
NetworkStream stream = client.GetStream();
//initialize data to by some byte array. the data you wish to send
stream.Write(data, 0, data.Length);



byte[] bytes = new bytes[1000] //instantiate a byte array
connection.stream.Read(bytes, 0, bytes.Length)  // wait here until data is send 

// in this line data has been received and it will be placed the bytes array

我用不同的字母标记每个节点。例如,请注意计算机A和计算机C如何恰好位于同一网络上:

enter image description here

希望这张照片能帮我解释一下我的意思。

在计算机A和C之间建立连接:

如果我想在计算机A和C之间建立连接,那么这可能是最简单的情况。换句话说,我不需要进行任何类型的端口转发来建立连接。

在计算机A和服务器S之间建立连接:

如果客户端计算机碰巧是计算机A而服务器计算机恰好是计算机S,那么计算机A将能够找到服务器S.所以这个连接也应该很简单。

在计算机A和计算机B之间建立连接:(这是我的问题)

因此,如果计算机A想要找到计算机B,则路由器Y必须将所有流量从端口“somePort P”转发到计算机B,并且A必须提供路由器Y的IP地址或WAN IP地址。

在此之前,我的标题问题应该没有意义,让我解释一下当我说“通过tcp连接到不同的计算机”时我的意思

我实际上需要在计算机A和计算机B之间建立连接,而无需配置路由器。我一直在思考,我认为这应该是可能的:(虽然这有点疯狂)

如果您在建立连接后记得我之前的代码,那么通过网络流发送/写入的所有内容都会被连接的另一端接收。因为计算机A无法连接到计算机B然后使A连接到服务器S.到目前为止,计算机A和服务器S之间存在连接。现在,在计算机B和服务器S之间建立tcp连接。服务器S应该有两个不同的tcp连接,一个连接到计算机A,另一个连接到计算机B.

因为服务器有两个不同的tcp连接,所以它应该还有两个NetworkStream对象。假设服务器S和计算机A之间的tcp连接具有对象NetworkStream streamA;,并且与计算机B的tcp连接具有对象NetworkStream streamB;

所以这是疯狂的部分。服务器S序列化实例化和工作对象streamB并将该对象发送到计算机A.然后计算机A反序列化该对象并将其转换为NetworkStream对象。计算机A现在应该具有对象streamB的副本。如果你通过这个流发送数据,会发生什么??理论上计算机B应该接收我认为的数据。我的意思是,我可能必须修改每个包头信息,以便路由器Y将这些包视为来自服务器S的那些包!

我之所以这样做是因为我创建了一个服务器应用程序和客户端应用程序,它将在特定文件夹上的两台计算机之间同步文件。很多时候使用这个程序的用户不知道如何启用端口转发。我也知道我可以使用所谓的“tcp puch holing”来解决这个问题,但我还是找不到c#的工作方法....

2 个答案:

答案 0 :(得分:3)

尝试通过连接发送流或连接类似于尝试通过电话线发送电话。哲学家称之为类别错误。你不能这样做。流是套接字的一个方面,套接字是现有连接的端点。期。它无法在任何地方发送。

答案 1 :(得分:2)

您建议的方法不起作用。 A和B都向S发送流量。无论S向A或B发送什么,A和B仍然会让其路由器(X和Y)仅将流量传递给S.你想要的是,如你所提到的,NAT洞冲孔。

NAT穿孔的基本思想是让A向B发送流量,B同时向A发送流量。如果操作正确,每个路由器(X和Y)都会认为来自另一端的数据包是对它发送的数据包的回复,并且它们将建立NAT条目,允许A和B直接相互通信。对于TCP来说这几乎是不可能的,但是can be done for UDP