А насколько легко пронаблюдать эту ситуацию в рамках эксперимента?
Несколько сокетов нельзя, потому что одном потоке у меня payload, а во втором heartbeat, обеспечивающий надежность соединения именно для этого payload.
С мьютексами никогда не работал.
Через указанный интервал отправляется пакет без данных, чтобы проверить живет соединение или нет.
Дело в том, что мне желательно отказаться от keepalive, вместо него реализовать heartbeat. Но почему отправка пакета с данными не дает такого эффекта? Я снова и снова вызываю Write, но никаких экскепшнов, пока не пройдут эти 30 сек.
res2001:
"Ваша программа использует .Net - вы уверены, что там все нормально? Версии .Net были одинаковы в обоих случаях? В плоть до последнего обновления? "
А если они не одинаковы, то уже и кип-алайвы могут не работать? Это нормально? По-моему нет, поэтому и предпочел сделать велосипед, который уж точно не зависит ни от реализации в ОС, ни в .NET.
Что вы пристали к этому велосипеду? Если я откажусь от него и таки заменю его системными кип-алайами, то описанная в вопросе проблема решится сама собой?
Олег Цилюрик: Ну, когда я пробовал заставить работать готовую WinAPI-вскую реализацию кип-алайвов и у меня тупо работало не везде, я делал все согласно матчасти, хотя, конечно, этой матчастью был не Стивенс, сомневаюсь, что он что-то пишет про WinAPI.
Да что там разработчики снифферов - вот, MSDN: https://msdn.microsoft.com/ru-ru/library/windows/d...
Слово "packet" в тексте статьи сами найдете?
Без обид, но меня больше волнует специфика ОС, под которую я пишу, чем глобальные сведения о TCP/IP, поэтому предпочту верить MSDN, а не Стивенсу, если он утверждает(-л), что пакетов не существует.
>> Проверяйте коды ошибок, возвращаемые методами передачи/приема.
Возвращаемое значение функции Write гляну, но похоже что в моем случае ошибка вообще не возвращается, иначе бы в .NET и так вылетал exception.
>> И да, кастомные keep-alive для TCP - это полная фигня - в протоколе уже все реализовано.
Если бы прекрасно работали готовые кип-алайвы, я бы стал строить велосипеды, при этом осознавая что они именно "кастомные" и что есть и готовые?
Вы всех подряд под дураков не равняйте.
Сервер был на Win Server 2003 x64, клиент Win 8.1 x64, готовые кип-алайвы работали, я был рад, быстро решил проблемы без велосипеда.
Но только я загрузил клиент на Win 7 x86 - как кип-алайвы работать перестали.
Точно не помню уже что именно было, но в сниффере было ясно видн.
Настройки в реестре были одинаковые... Мне на досуге еще раз попробовать?
Какие у вас основания так свято верить, что готовая MSовская реализация кип-алайвов в WinAPI не имеет багов?
Я знаю, что в том же WinAPI есть библиотека Video for windows, и в ней вот точно баги, захват с камеры работает буквально через раз, проблема не только у меня, я кучу приложений видел построенных на ней, и ни одно с современными веб-камерами нормально не работает, чему я в отличие от вас не удивлен, библиотека древняя, а ведь TCP/IP не менее древний.
строить влосипеды из keep-alive'ы в "кастомной реализации"...
Если бы прекрасно работали готовые кип-алайвы, я бы стал строить велосипеды?
Вы всех подряд под дураков не равняйте.
Сервер был на Win Server 2003 x64, клиент Win 8.1 x64, готовые кип-алайвы работали, я был рад, быстро решил проблемы без велосипеда.
Но только я загрузил клиент на Win 7 x86 - как кип-алайвы работать перестали.
Точно не помню уже что именно было, но в сниффере было ясно видн.
Настройки в реестре были одинаковые... Мне на досуге еще раз попробовать?
Какие у вас основания так свято верить, что готовая MSовская реализация кип-алайвов в WinAPI не имеет багов?
Я знаю, что в том же WinAPI есть библиотека Video for windows, и в ней вот точно баги, захват с камеры работает буквально через раз, проблема не только у меня, я кучу приложений видел построенных на ней, и ни одно с современными веб-камерами нормально не работает, чему я в отличие от вас не удивлен, библиотека древняя, а ведь TCP/IP не менее древний.
нет и быть не может никаких пакетов
Оригинально. Значит, все разработчики снифферов ошибаются, активно употребляя в интерфейсе слово "packet"? Пакеты есть, а то что программный интерфейс потоковый, это я и без вас вишу, там Stream байтов.
Что такое NetworkManager, что он даст?
Размер пакета я пишу, в том-то и дело, что при таком разрыве пакет нормально принимается, и размер правильный, но в нем оказываются нули начиная с определенного байта.
Rsa97: "Обычно" очень напрягает... Может втопку keepalive и просто сделать на клиенте таймер, который будет выявлять дисконнект и тут же переподключаться?
Владимир Дубровин: А как узнать, как часто отправлять контрольные пакеты? Или как задать в системе (сервер или клиент), чтобы за такой-то интервал без контрольных пакетов соединение не рвалось?
Rsa97: А вот еще есть такой параметр в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
KeepAliveTime
Вернее, по умолчанию его там нет, в статье пишут что в таком случае он равен 2 часам. Какое именно время он задает? Это и есть то время, когда соединение рвется если НЕ установлена опция KeepAlive?
Написано только что