Я пытаюсь реализовать перфорацию TCP с помощью сокета Windows, используя mingw toolchain.Я думаю, что процесс правильный, но дыра , похоже, не занимает.Я использовал этот в качестве справочного.
- A и B подключение к серверу S
- S отправляет A , B IP-адрес маршрутизатора + порт, который использовался для подключения к S
- S делает то же самое для B
- A запуск 2 потоков:
- Один поток пытается подключиться к * 1036Маршрутизатор * B с информацией, отправленной S
- Другой поток ожидает входящего соединения на том же порту, который использовался для подключения к маршрутизатору при подключении к S
- B делает то же самое
У меня нет проблем в коде, который я думаю, так как:
- A и B получает IP-адрес и порт друг друга для использования
- Они оба прослушивают порт, который они использовали для подключения к своемумаршрутизатор, когда они связались с сервером
- Они оба подключаются к нужному ip и порту, но получают времяt (ошибка кода
10060
)
Я что-то упустил?
РЕДАКТИРОВАТЬ: С помощью Process Explorer, я вижу, что один из клиентаудалось установить соединение с пэром.Но узел, похоже, не считает, что соединение установлено.
Вот то, что я запечатлел с помощью Wireshark.Для примера, сервер S и клиент A находятся на одном компьютере.Сервер S прослушивает определенный порт (8060
), перенаправленный на этот ПК. B по-прежнему пытается подключиться к нужному IP-адресу, поскольку видит, что открытый адрес A , отправленный S , равен localhost
и поэтому использует открытый IP-адрес S вместо.(Я заменил общедоступные IP-адреса местозаполнителями)
EDIT 2 : Я думаю, что путаница связана с тем, что и входящий и исходящий запрос на подключениеданные передаются по одному и тому же порту.Который, кажется, портит состояние соединения, потому что мы не знаем, какой сокет получит данные из порта.Если я приведу msdn:
Опция сокета SO_REUSEADDR
позволяет сокету принудительно связываться с портом, используемым другим сокетом.Второй сокет вызывает setsockopt с параметром optname, установленным в SO_REUSEADDR
, и параметром optval, установленным в логическое значение TRUE
, перед вызовом bind на том же порту, что и исходный сокет. Как только второй сокет успешно связан, поведение для всех сокетов, связанных с этим портом, является неопределенным.
Но для разговора по одному и тому же порту требуется техника перфорации отверстий TCP для открыть отверстия !