Добрых дней, господа! Как и в прошлый раз, отношение к ассемблеру косвенное, но где, если не здесь могут помочь? Ситуация такова: Компьютер А, Компьютер Б, Компьютер С Компьютер Б находится в локальной сети с Компьютером А. Компьютер С НЕ находится в локальной сети с Компьютером А. У компьютера А есть внутренний ИП (192.168...) и внешний ИП. На компьютере А открыт порт 10000. При попытке подключения с компа А к компу А на порт 10000 по внутреннему ИП - все нормально, никаких отклонений. При попытке подключения с компа А к компу А на порт 10000 по внешнему ИП - "... конечный компьютер отверг запрос на подключение" после выхода таймаута. При попытке подключения с компа Б к компу А на порт 10000 по внешнему ИП - та же самая ошибка. При попытке подключения с компа Б к компу А на порт 10000 по внутреннему ИП - все нормально... При попытке подключения с компа С к компу А на порт 10000 (по внешнему конечно же) - ВСЕ нормально. Компьютер А и Б выходят в сеть через роутер (адсл модем) Компьютер С не имеет значения. Провел эксперимент на других провайдерах - все 5 случаев из 5 отрабатываются нормально. В связи с этим, у меня вопрос, на что можно обратить внимание, чтобы попытаться решить проблему? Абсолютно нет никаких идей. а проблема какая-то ненормальная... З.Ы: Понимаю, что инорфмативность минимальная, но надеюсь на какие нибудь направления и указания. Спасибо)
Можно подробнее, как организован "внешний адрес" на компе А? ПРосто белый адрес прописан на сетевой карте, белый адрес получается через PPPOE или PPTP? И к чему были упомянуты роутеры(модемы) и провайдеры? Может быть под внешним адресом понимался такой, под которым роутер NAT-ит этот комп в интернет (тогда непонятно, как мог вообще подключаться С из инета, если только специально в модеме не прописан проброс порта/виртуальный сервер)? Еще, как именно подключен модем-роутер, включен в общую локалку с A и Б, или Б работает через А?
Aspire Нормально, значит работает. т.е происходит подключение(если тсп) и отправка-прием данных. Важное дополнение: На Компьютере А происходит именно ошибка(со стороны винды, приложение валится), на компьютере Б - приложение не валится, просто блокируется поток в receive. (что означает, что данные просто где-то потерялись) Dmitry_Milk Адрес выдается провайдером, он динамический, но белый. На компьютере А в настройках подключения указан статический локальный адрес(остальные адреса раздаются по DHCP). в настройках роутера указан DMZ хост на статический адрес компьютера А. Что делает компьюер А полностью видимым в сети. Адрес получается через PPPoE. Роутеры(модемы) и провайдеры упомянул потому, что у человека Х эзернет провайдер и у него никаких проблем(с другими не тестил). Да, все верно роутер переадресовывает все пакеты(ну или почти все) из сети на Компьютер А. А и Б включены в общую локалку и интернет раздается роутером(модемом) на все компьютеры в сети (А и Б)
Все же размещу алгоритм действий тестовой программы: ТочкаВхода { СозданиеПоток А СозданиеСокета1_Привязка его к порту 10000 (УДП) БлокирующийВызов recv у сокета 1 ОтправкаДанныхОбратноПри получении от сокета 1 } ПотокА { ОжиданиеВводаENTER СозданиеСокета2_Привязка его к порту 42343 (УДП любой порт) ОтправкаДанных_С Сокета на оконечную точку - ПубличныйIP:10000 БлокирующийВызов recv у сокета 2 -- Именно здесь валится ошибка (в случае компа А) или просто ожидание данных (в случае компа Б) } recv у сокета 1 не разблокируется, а у сокета 2 ошибка. Код ошибки 10054 (для компьютера А)
Ну тогда все понятно. У вас ведь на компьютере А нет внешнего белого адреса. А роутер будет NAT-ить destination-IP только для пакетов, пришедших к нему с WAN-стороны, и наоборот, будет NAT-ить source-IP только у тех пакетов, что должны уйти через WAN-порт (а при обращении компа А или Б к белому адресу ни в ту, ни в другую сторону прохожения WAN-порта нет). То есть, таким образом вы не сможете организовать однозначное обращение. Вам необходимо сделать именно наличие белого адреса на компе А, скажем, использовать сам комп А как роутер с NAT, переведя модем просто в режим бриджа, и устанавливая соединение с провайдером прямо с компа А, и, конечно же, используя теперь на других компах локалки в качестве defaul-маршрута внутренний адрес компа А (но только не на самом компе А).
Есть еще один вариант - некоторые модемы-роутеры имеют опцию pppoe passthrou, то есть несмотря на то, что сам модем устанавливает PPPOE-соединение и является роутером с NAT, он может как бридж пропускать PPPOE-фреймы из локалки и обратно. Если провайдер разрешает устанавливать несколько PPPOE через один модемный линк и каждому PPPOE-линку дает уникальный белый IP-адрес, то параллельно к работающей схеме с модемом-роутером компьютер А сможет получить еще и свой персональный белый адрес. От какого адреса компьютер А будет обращаться к компам вне локалки зависит от приоритетов default-маршрута. Под Windows дефаулт PPPOE становится приоритетнее дефаулта на сетевухе. К локалке комп А будет продолжать обращаться от своего серого адреса.