Прослушайте определенный IP-адрес и порт с помощью tcplistener

Я создаю приложение для совместного использования экрана. Чтобы разрешить прохождение через nat, мне нужно сделать это через сервер, мне просто интересно, как я могу проверить, что клиент, пытающийся подключиться к серверу, - это тот, кого я хочу подключить, а не кто-то другой, при этом фактически не блокируя другие люди не смогут подключиться к этому порту.

Я думаю об использовании BeginAcceptTcpClient() вместо AcceptTcpClient (), есть ли способ проверить, кто пытается подключиться, прежде чем он примет соединение таким образом, чтобы он мог быть обнаружен TcpListener позже?

Единственное, что я могу сделать, это отправить идентификатор человека, которому я хочу отправить изображение в соединении, и позволить серверу определить, кому его отправлять, но будет ли это слишком медленным или ресурсоемким?

2 ответа

Я думаю, что следующего должно быть достаточно, чтобы увидеть, подключен ли правильный клиент к вашему серверу:

  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. Десериализовать сообщение из байтов в строку и проверить, например, соответствует ли оно ожидаемому уникальному идентификатору:

`

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, список можно продолжить.

Мне интересно, что вы планируете использовать:)

Может быть, вам стоит взглянуть на то, как join.me делает это:

  • На первой машине запускается Observable.
    • Он подключается к центральному серверу и получает уникальный идентификатор (билет), который будет показан пользователю.
  • На второй машине запускаем Обозреватель.
    • Он также подключается к центральному серверу и ожидает ввода нужного идентификатора для подключения.
  • Теперь пользователь на наблюдаемой машине должен сообщить идентификатор парню-наблюдателю по другому каналу (например, по телефону).
  • Наблюдателю вводится номер билета, и сервер может отправлять обеим машинам IP-адрес и порт друг друга, где они проделали дырокол. Если прямое подключение возможно, центральный сервер завершил свою работу, в противном случае обе стороны отправят свои данные на сервер и от своего другого клиента.

Таким образом, чтобы убедиться, что правильные клиенты подключены, просто создайте уникальный идентификатор, которым обе стороны должны поделиться через другой канал связи.

Другие вопросы по тегам