Конфигурация. Имеется два компа, подключаемых в инет через два маршрутизатора - DI-704P (HW:B1) и DI-604 (HW:B2). Настройки маршрутизаторов вроде в порядке. Инет виден, связь есть с обоих компов.
Задача. Есть небольшая программка, которая представляет из себя клиент/серверное приложение, умеющее посылать/принимать данные по TCP-каналу. Приложение использует стандартный набор BSD-шных функций для работы с TCP/IP (socket, connect, bind, accept, send, recv и т.п.). Приложение может либо отсылать данные (send), либо получать данные (recv) - это определяется параметром запуска программы. Соответственно, для соединения двух компов (A и B) мы имеем 4 возможных варианта коммуникации:
1. комп A - отсылающий сервер, комп B - принимающий клиент
2. комп A - принимающий сервер, комп B - отсылающий клиент
3. комп A - отсылающий клиент, комп B - принимающий сервер
4. комп A - принимающий клиент, комп B - отсылающий сервер
Проблема. Допустим, комп A соединен с DI-704P (соответственно, комп B с DI-604). Если пробовать все 4 вышеперечисленных варианта коммуникаций, то работают только 3 из них. Стабильно не работает вариант "3. комп A - отсылающий клиент, комп B - принимающий сервер". Нерабочесть проявляется в том, что все проходит нормально, клиент с сервером друг друга видят, связь налаживается, но вот как только дело доходит до посылки данных, наступает затык. На стороне компа B приложение получает от 3-х до нескольких сотен байт и все, дальше все останавливается. Если это дело не прерывать, то через какое-то время (порядка минуты) клиент на компе A закончит очередную попытку посылки с отрицательным ответом, ответит, что связь потеряна, и программы заканчивают работу.
PS. Если убрать из этой цепочки маршрутизаторы и подключить компы напрямую в инет (посадить их на внешние IP-адреса), то все работает великолепно во всех вариантах.
PSS. Если убрать из цепочки только один из маршрутизаторов (неважно какой), то все работает великолепно во всех вариантах.
PSSS. Я сначала думал, что что-то не так в приложении и чего-то не то делаю с сокетами. Но потом нашел похожий пример приложения WSOCK из набора примеров Microsoft MSDN. С ним ситуация абсолютно такая же.
Вопрос. Сталкивался ли кто-нибудь с подобной проблемой? Что можете мне посоветовать?
Буду очень признателен, если копия ответа будет выслана мне мылом на
ara@tract.ru