C# 使用tcplistener侦听特定的IP地址和端口

C# 使用tcplistener侦听特定的IP地址和端口,c#,tcp,nat-traversal,C#,Tcp,Nat Traversal,我正在创建一个屏幕共享应用程序。为了允许nat遍历,我必须通过服务器来完成这项工作,我只是想知道如何检查尝试连接到服务器的客户机是否是我想要连接的客户机,而不是其他人,同时不阻止其他人连接到该端口 我正在考虑使用BeginAcceptTcpClient()而不是AcceptTcpClient()。在它接受连接之前,有没有办法检查谁在尝试连接,以便TcpListener稍后可以接收到它 我唯一能做的另一件事是在连接中发送我想发送图像的人的ID,并让服务器处理发送给谁,但这会太慢或资源密集吗?也许你

我正在创建一个屏幕共享应用程序。为了允许nat遍历,我必须通过服务器来完成这项工作,我只是想知道如何检查尝试连接到服务器的客户机是否是我想要连接的客户机,而不是其他人,同时不阻止其他人连接到该端口

我正在考虑使用BeginAcceptTcpClient()而不是AcceptTcpClient()。在它接受连接之前,有没有办法检查谁在尝试连接,以便TcpListener稍后可以接收到它


我唯一能做的另一件事是在连接中发送我想发送图像的人的ID,并让服务器处理发送给谁,但这会太慢或资源密集吗?

也许你应该看看如何做到:

  • 在第一台机器上启动可观察到的。
    • 这将连接到中央服务器并接收将显示给用户的唯一id(票证)
  • 在第二台机器上启动观察者。
    • 这还会连接到中央服务器,并等待输入所需的id以连接到
  • 现在,可观察机器上的用户必须通过不同的渠道(如电话)将id传达给观察者
  • 在观察者上输入票证号,服务器可以向两台机器发送彼此的ip地址和端口,它们在其中打孔。如果可以直接连接,则中央服务器已完成其工作,否则双方将向服务器发送数据,并从其客户端向另一客户端发送数据

因此,为了确保连接正确的客户端,只需创建一个唯一的id,双方必须通过不同的通信渠道共享该id。

我认为以下内容足以查看是否正确的客户端已连接到您的服务器:

  • 创建TCPListener并开始同步或异步接受连接。我正在使用MSDN中的同步示例:

  • 当客户端连接时,创建一个流来读取客户端发送的数据,如下所示:

    NetworkStream=client.GetStream(); i=stream.Read(字节,0,字节.长度)

  • 将消息从字节反序列化为字符串,并检查它是否与您期望的唯一ID匹配:

  • `

    `

    一个更有趣的问题是如何捕捉您将要共享的实际屏幕。我个人在VS C++中完成了,性能也不错。有几种方法可以做到这一点,例如使用GDI+,使用DirectX或OpenGL,列表如下

    我很好奇你打算用什么:)

    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    //There are, of course, better ways of doing this.
    if(data.Equals("HandshakeId")
    {
    //start receiving/sending data in a loop
    }
    else
    {
     // Shutdown and end connection
      client.Close();
    }