В нашем приложении есть связь между сервером и клиентом. Розетки используются для связи.
Мы используем сокеты AF_INET с SOCK_STREAM (TCP / IP).
Также эти сокеты находятся в неблокирующем режиме (O_NONBLOCK).
Приложение написано на C ++ в UNIX.
В нашей системе Сервер будет писать в сокет, а Клиент будет читать с него. Мы написали код для обработки частичной записи. Если произойдет частичное, мы попробуем еще 30 раз записать все данные.
Наш сервер пытается записать 2464 байта в сокет. В некоторых случаях он не мог записать все данные. Таким образом, сервер попытается написать еще 30 раз, чтобы передать все данные. В большинстве случаев все данные будут записаны в течение 30 попыток.
Но иногда даже после 30-ти пенсий сервер не сможет записать все данные. Здесь будет выкидывать ошибку EAGAIN. Проблема возникает на стороне клиента, когда он пытается прочитать эти частично записанные данные.
Считайте, что сервер пытался записать 2464 байта. Но после повторных 30 попыток он мог записать только 1080 байт. Сервер поднимет EAGAIN в этот момент. Клиент пытается прочитать 2464 байта. Команда чтения вернет 2464, и, следовательно, само чтение в порядке. Но полученные нами данные повреждены (только частично записанные данные). Так что клиент вылетает.
Может ли кто-нибудь посоветовать, пожалуйста,
1) Можно ли удалить только частично записанные данные самим сервером. Таким образом, клиент не получит поврежденные неполные данные ». (Мы не можем использовать функцию read () с сервера, чтобы удалить это. Рассмотрим, как сервер успешно записал n сообщений в сокет. Клиент находится в занятом состоянии и не может их прочитать. Затем сервер пытается написать n + 1-е сообщение и Произошла частичная запись. Если мы используем команду чтения с сервера, удаляются все n успешных сообщений. Нам нужно удалить только сообщение Частично остроумие (n + 1-е))
2) Есть ли способ идентифицировать на стороне клиента, что мы прочитали частично написанное сообщение?.
Обратите внимание, что мы сталкиваемся с проблемой частичной записи только в LINUX (REDHAT 5.4). В Solaris система работает нормально (в солярисе либо будут записаны все данные, либо НЕТ данных, которые будут записаны при 30 попытках записи).
Заранее спасибо.