Почему мое соединение с сокетом клиент-сервера продолжает отключаться

У меня есть клиент-серверное приложение для написания приложений на С# .NET с использованием сокетов.

Я часто получаю сообщения журнала (скажем, около 4 в час), говорящие это сообщение,

An existing connection was forcibly closed by the remote host

В данном случае ошибка возникает на стороне «сервера».

Я решил использовать wireshark для анализа происходящего, и у меня это получилось. Никаких задержек, это все происходит в течение пары секунд.

Server > Client [PSH, ACK] Seq=55653 Ack=4472  Win=63940 Len=148
Client > Server [ACK]      Seq=4472  Ack=55801 Win=4038  Len=0
Server > Client [PSH, ACK] Seq=55801 Ack=4472  Win=63940 Len=148
Client > Server [ACK]      Seq=4472  Ack=55949 Win=4001  Len=0 
Server > Client [PSH, ACK] Seq=55949 Ack=4472  Win=63940 Len=142
Client > Server [PSH, ACK] Seq=4472  Ack=55949 Win=4001  Len=31
Client > Server [RST, ACK] Seq=4503  Ack=55949 Win=0     Len=0

Таким образом, клиент и сервер отправляют данные между собой (PSH) и подтверждают данные (ACK). Внезапно происходит RST. Согласно википедии, это сброс, и этот сброс соответствует сообщению «Существующее соединение было принудительно…», которое я получаю выше.

Что это на самом деле означает? Означает ли это, что сброс вызывает проблему? Я думаю, что ответ на этот вопрос — нет, и что имеет больше смысла, так это то, что сброс является результатом проблемы? т.е. Сокет на стороне сервера по какой-то причине умирает, и клиент отправляет сброс на сервер, чтобы попытаться разбудить его.

Мысли?


person peter    schedule 23.06.2010    source источник


Ответы (2)


Иногда клиент, который ведет себя неправильно, получает или отправляет то, что хочет, а затем немедленно завершает работу (закрывая сокет и резко разрывая соединение). Это нормально иногда видеть это на любом сервисе, доступном в Интернет.

Если это вызвано вашим собственным кодом, убедитесь, что вы отправляете любую команду «Я закончил сейчас» (обычно это «ВЫЙТИ») и правильно «закрываете» соединение, прежде чем закрыть его. Кроме того, единственные сбросы, которые вы должны вызывать, будут связаны с потерей доступа к Интернету.

person cHao    schedule 23.06.2010
comment
Итак, в первом абзаце вы имеете в виду хакеров, верно? Это не то, но хороший момент, хотя. Вы упомянули об отправке команды «Я готов». Я посмотрю на это, потому что я думаю, что это может помочь. Проблема, однако, в том, что я подозреваю, что это «не сделано». Он не должен закрывать соединение там, где оно есть, и если это так, я ожидаю увидеть какую-то другую ошибку. - person peter; 23.06.2010
comment
Я имею в виду хакеров, а также плохо написанных (но в остальном законных) клиентов. Пока ваш серверный код может учитывать людей, которые делают что-то неправильно (законно или нет), вам нечего бояться, кроме людей, которые знают, что у вас что-то работает на данном порту. Что касается того, почему ваш клиент сбрасывает соединение (и похоже, что это, вероятно, так, если ваше интернет-соединение стабильно), возможно ли, что что-то вызывает исключение, заставляя код покинуть ваш блок использования (вы использование блоков использования, верно?) и удаление сокета? - person cHao; 23.06.2010

Являются ли сервер и клиент вашим собственным кодом. Даже я столкнулся с подобной проблемой, но в моем случае сервер не был моим кодом, и поэтому я не мог понять, почему клиент закрывал соединение и отправлял сообщения PSH и RST.

В любом случае, если вы получите ошибку, подобную той, что у вас есть, целесообразно создать новый сокет и установить связь.

person ckv    schedule 23.06.2010