Umut Comlekcioglu Ответов: 0

Сетевое программирование-коммуникация приложений


Я разрабатываю новое программное обеспечение, и мне нужно общаться с этими приложениями между собой, такими как TeamViewer и Skype. Для этой задачи я прочитал слишком много статей и написал код, но я не могу этого сделать. Я должен использовать TCP, это не может быть UDP. Безопасность данных очень важна для моего приложения.

http://www.codeproject.com/Articles/807861/Open-NAT-A-NAT-Traversal-library-for-NET-and-Mono

Я обнаружил, что N (etwork)A(address) T(ranslation) может решить мою проблему, и я использую ее. Я пишу тот же код, что и они, но все равно не работает...

КЛИЕНТСКИЕ КОДЫ ПРОСЛУШИВАТЕЛЯ
NatDiscoverer discoverer = new NatDiscoverer();
CancellationTokenSource cts = new CancellationTokenSource(5000);
NatDevice device = await discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts);

// display the NAT's IP address
Console.WriteLine("The external IP Address is: {0} ", await device.GetExternalIPAsync());

// create a new mapping in the router [external_ip:1702 -> host_machine:1602]
await device.CreatePortMapAsync(new Mapping(Protocol.Tcp, 1602, 1702, "For testing"));

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 1602);
socket = new Socket(endPoint.AddressFamily, SocketType.Stream,ProtocolType.Tcp);
socket.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
socket.Bind(endPoint);
socket.Listen(4);


ЗАПРОС КОДОВ ОТПРАВИТЕЛЯ КЛИЕНТА
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("100.96.106.192"), 1602);
                sock.Connect(ipep);

Это 2 клиента, и я хочу соединить их таким образом. "100.96.106.192" - это публичный IP-адрес компьютера (а не маршрутизатор(внешний) IP-адрес)..

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

Например, я начинаю прослушивать клиент и в " cmd "пишу" netstat-a " и вижу, что он слушает 0.0.0.0:1602. Но Почему?

Пожалуйста, помоги мне и направь меня. Что не так с моим кодом? Что я делаю не так? Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ:
Я перешел на клиентский код слушателя с помощью
IPEndPoint endPoint = new IPEndPoint(device.GetExternalIPAsync(), 1602);

Но на этот раз он вызвал исключение для метода BIND() : Запрошенный адрес недействителен
Когда я удаляю метод BIND (), он выбрасывается и исключение для метода Listen(4) :Был приведен недопустимый аргумент

Спасибо за все ответы и помощь. Хорошего вам дня, хороших дел...

Что я уже пробовал:

Я пробовал TCPListener, TCPClient, другие сетевые библиотеки и т. д. Но я не получил того результата, которого хотел.

Foothill

Я не специалист по сетям, но могу добавить вот что. 0.0.0.0:1602-это порт, который прослушивает ваше приложение. Для двусторонней связи между компьютерами один обычно действует как сервер, а другой-как клиент. Если вы хотите, чтобы два пользовательских компьютера разговаривали, я бы предложил создать сервер, который будет выступать посредником между ними.

[no name]

Если вы используете IPAddress.Любой, это означает 0.0.0.0. Но если вы хотите прослушать определенный IP-адрес, то используйте IPAddress.Разбор ("100.96.106.192") для вашего слушателя. Если я прочитаю его еще раз, ваш компьютер имеет публичный IP-адрес, и почему вам все еще нужна переадресация портов ?

Umut Comlekcioglu

Когда я меняю его на IPAddress.Parse ("100.96.106.192"); на этот раз он вызвал исключение для метода Bind (). Если я удаляю at-строку кода, она вызывает исключение для метода Listen(4).. Там я тоже написал эту ситуацию..

http://www.codeproject.com/Articles/807861/Open-NAT-A-NAT-Traversal-library-for-NET-and-Mono

Я использую эту библиотеку, и мне не нужно переадресовать порт. После процессов NAT он создает и общедоступный IP-адрес для моего компьютера.

0 Ответов