2014-10-22 4 views
0

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

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

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

ответ

0

Может быть, вы должны смотреть на то, как join.me делает это:

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

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

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 (байты, 0, байты.Длина);

  3. Deserialize сообщение из байтов в строку и проверить, если он, например, соответствует уникальный идентификатор, который вы ожидаете:

`

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, список продолжается ..

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

Смежные вопросы