使用tcplistener监听某些IP地址和端口

时间:2014-10-22 10:55:18

标签: c# tcp nat-traversal

我正在创建一个屏幕共享应用程序。为了允许nat遍历,我必须通过服务器执行此操作,我只是想知道如何检查尝试连接到服务器的客户端是我想要连接的客户端而不是其他人,而实际上并没有阻止其他人连接到该端口。

我想使用BeginAcceptTcpClient()而不是AcceptTcpClient()是否有办法检查谁在尝试连接之前以这种方式接受连接,以便以后可以通过TcpListener获取它?

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

2 个答案:

答案 0 :(得分:0)

也许你应该看看join.me如何做到这一点:

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

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

答案 1 :(得分:0)

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

  1. 创建TCPListener并开始同步或异步接受连接。我使用了MSDN中的同步示例:http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx

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

    NetworkStream stream = client.GetStream(); i = stream.Read(bytes,0,bytes.Length);

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

  4. `

    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();
    }
    

    `

    一个更有趣的问题是如何捕捉您将要分享的实际屏幕。我个人在VS C ++中做过这个,性能还可以。有几种方法可以做到这一点,即使用GDI +,使用DirectX或OpenGL,列表继续...

    我很想知道你打算用什么:)