
Я работаю над приложением C#, обрабатывающим TCP-сокеты.
У меня есть серверное приложение (Геркулес) на удаленной машине, пытаясь сохранить сокет открытым.
У меня есть приложение на моей машине, подписывающееся на этот открытый сокет.
я используюTCPViewer от Microsoftчтобы следить за происходящим.
Через несколько минут я вижу, что сокет переходит из установленного состояния в состояние ожидания, а затем соединение с сокетом разрывается.
Я искал в окне просмотра событий обоих компьютеров событие с идентификатором 4227 во всех общих расположениях (Журналы Windows/Приложение, /Безопасность, /Настройка, /Система и /Пересланные события), но ничего не нашел.
Что мне нужно сделать, чтобы узнать, какая машина на самом деле закрывает TCP-сокет и почему?
решение1
Что мне нужно сделать, чтобы узнать, какая машина на самом деле закрывает TCP-сокет?
Для того, чтобы узнать, какая сторона закрывает соединение, необходимо сделать захват пакетов. Смотретьhttps://wiki.wireshark.org/TCP-4-times-close.mdкак выглядит закрытие соединения в Wireshark. Сторона, которая отправляет начальный FIN, является той, которая закрыла соединение.
... и почему?
Это невозможно сказать, просто взглянув на трафик. Соединение может быть закрыто, потому что протокол прикладного уровня ожидает или позволяет это сделать. Оно может быть закрыто из-за сбоя клиента или сервера. Оно может быть закрыто стороной из-за нарушения протокола, т. е. если другая сторона ведет себя не так, как ожидалось... Поэтому, чтобы выяснить причину, вам нужно понять протокол приложения, просмотреть файлы журналов, проверить, запущены ли процессы и т. д.