Прослушайте определенный IP-адрес и порт с помощью tcplistener
Я создаю приложение для совместного использования экрана. Чтобы разрешить прохождение через nat, мне нужно сделать это через сервер, мне просто интересно, как я могу проверить, что клиент, пытающийся подключиться к серверу, - это тот, кого я хочу подключить, а не кто-то другой, при этом фактически не блокируя другие люди не смогут подключиться к этому порту.
Я думаю об использовании BeginAcceptTcpClient() вместо AcceptTcpClient (), есть ли способ проверить, кто пытается подключиться, прежде чем он примет соединение таким образом, чтобы он мог быть обнаружен TcpListener позже?
Единственное, что я могу сделать, это отправить идентификатор человека, которому я хочу отправить изображение в соединении, и позволить серверу определить, кому его отправлять, но будет ли это слишком медленным или ресурсоемким?
2 ответа
Я думаю, что следующего должно быть достаточно, чтобы увидеть, подключен ли правильный клиент к вашему серверу:
Создайте TCPListener и начните принимать соединения синхронно или асинхронно. Я использую синхронный пример из MSDN: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx
Когда клиент подключается, создайте поток для чтения данных, отправленных клиентом, следующим образом:
NetworkStream stream = client.GetStream (); i = stream.Read (bytes, 0, bytes.Length);
Десериализовать сообщение из байтов в строку и проверить, например, соответствует ли оно ожидаемому уникальному идентификатору:
`
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-адрес и порт друг друга, где они проделали дырокол. Если прямое подключение возможно, центральный сервер завершил свою работу, в противном случае обе стороны отправят свои данные на сервер и от своего другого клиента.
Таким образом, чтобы убедиться, что правильные клиенты подключены, просто создайте уникальный идентификатор, которым обе стороны должны поделиться через другой канал связи.