0

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

我正在考虑使用 BeginAcceptTcpClient() 而不是 AcceptTcpClient() 有没有办法在它以这种方式接受连接之前检查谁在尝试连接,以便稍后 TcpListener 可以拾取它?

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

4

2 回答 2

0

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

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

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

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

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

`

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,不胜枚举。

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

于 2014-10-22T14:03:51.843 回答
0

也许你应该看看join.me是如何做到的:

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

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

于 2014-10-22T11:34:34.390 回答