2016-12-02 17 views
-1

Работа с задачей клиентского приложения (работает в Windows), которая использует асинхронную связь (с сокетами) с сервером базы данных (работает на Linux).Не удается прочитать ответные сообщения сервера при возникновении ошибки WSAECONNRESET?

Клиентское приложение попало с ошибкой WSAECONNRESET при загрузке данных на сервер, и сервер завершает работу сокета. Я использовал функцию WSAGetLastError и извлек сообщение об ошибке. Сервер отправил нескольким сообщениям (сообщение об ошибке конкретного приложения) клиенту перед завершением сокета с ошибкой WSAECONNRESET. Клиент не может извлечь последнее сообщение, которое отправляется сервером (поскольку сокет закрыт и функция «recv» не работает). Мой вопрос: Как извлечь последние сообщения, отправленные сервером базы данных (на linux) клиенту (на окнах)?

Обратите внимание, что этот случай отлично работает с сервером базы данных linux для клиента linux. Я имею в виду, unix-сокет для unix-сокета. Но проблема возникает только при подключении linux к соединению сокетов Windows.

Цените свою помощь Пожалуйста!

+0

Я добавил тэг TCP, надеюсь, один из экспертов зазвонит. Но [согласно Википедии] (https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination) вы нарушаете правила, закрывая соединение до того, как клиент подтвердил получение сообщения об ошибке. –

+0

@HarryJohnston Он нарушает правила путем * сброса * соединения. Закрытие его правильно может иметь только такой эффект, если есть непрочитанные данные. Утверждение в Википедии неверно. Было * неверно: я исправил это. – EJP

ответ

1

Вы не можете. «Сброс соединения» разрушает соединение, и все данные в полете теряются, включая любые, которые могут быть уже буферизованы в приемнике.

Необходимо устранить проблему, которая вызывает сброс.

+0

Просто повторюсь ... код отлично работает с linux-сервером для клиента linux. Но не удается с сервером linux для клиентов Windows (кросс-платформа). По моим сведениям, поведение и обработка сокета в windows и linux немного отличаются. Я хочу сказать, что сокет - это всего лишь дескриптор файла в Linux, но это не относится к окнам. Пожалуйста, поправьте меня, если я ошибаюсь. Я считаю, что должен быть способ прочитать последнее сообщение с сервера (которое он отправляет до закрытия сокета). Да, я полностью согласен с вами в том, что когда сокет закрывается, данные не доступны. –

+0

Сервер разместил сообщения об ошибках в буфере, прежде чем он закрыл сокет. Когда клиент linux смог успешно прочитать сообщения с вызовом «recv», почему клиент Windows не может этого сделать? Должен быть способ сделать это. Почему-то я этого не замечаю !! –

+0

Если я понимаю, что EJP говорит правильно, проблема может быть в другом месте кода. Например, возможно, в клиенте Windows есть ошибка, которая означает, что он отправляет больше данных, чем должен, и сервер не считывает эти данные; по-видимому, это изменит закрытие на сброс и вызовет отклонение сообщений об ошибках. Возможно, вам лучше предоставить [mcve]. –