LINUX.ORG.RU

Вопрос по сокету-2


0

0

Вопрос по сокету-2

Язык СИ
ОС UNIX

Имеются «клиент» и «сервер» (самодельные).
Работают поверх TCP.

Фрагмент клиента:

//--- sd_client -сокет, соединенный с сервером ---

k=read(sd_client, buf, sizeof(buf));

Конец фрагмента.

Сервер на запрос клиента посылает данные,
а затем закрывает сокет close(sd_serv) на своей стороне.
При закрытом на сервере сокете (sd_serv),
на стороне клиента вызов read()
возвращает 0, и это признак конца передачи.

В штатном режиме это работает.
Но на сервере иногда случаются ошибки (не доступны
все или часть данных).

Вопрос.
Возможно ли на стороне сервера
так подействовать на сокет (sd_serv),
что бы на стороне клиента вызов read()
вернул бы -1.

Кто знает прошу ответить.



Это нелепая постановка вопроса, правильный путь организавать такой протокол обмена, чтобы сервер сообщал о том, что конкретно у него есть на передачу, передачей, например, заголовка. Организовать о может 3 ситуации - передать не передать и разорвать соединение. В последнем случае вызов read прервётся даже если есть ещё данные с errno==EINTR.

gena2x ★★★
()
Ответ на: комментарий от Zitzy

Протокол HTTP/1.0
Речь идет о прокси-сервере.

По первоначальному замыслу
схема работы такая:

-клиент посылает запрос.
-прокси-сервер подключается по указанному
в запросе адресу.
-прокси-сервер передает туда запрос клиента.
-прокси-сервер перекачивает данные от целевого
сервера клиенту без накопления и без преобразования.
-закрывает сокет - признак конца файла.

В этой схеме не предусмотрена обработка случая,
когда происходит ошибка во втором канале:
прокси-сервер - целевой сервер, т. е. когда
сам прокси-сервер получает -1 чтения сокета.

Вот если б эту -1 передать клиенту.
А так клиент думает, что получен весь файл целиком.

oleg_2
() автор топика
Ответ на: комментарий от oleg_2

сообщение от gena2x

... разорвать соединение.
В последнем случае вызов read прервётся
даже если есть ещё данные с errno==EINTR.

Это не понятно.
Как разорвать соединениие.
Чуть подробнее об этом.

oleg_2
() автор топика
Ответ на: комментарий от oleg_2

я знаю, что вызов read() клиента прерывается
если сервер закроет сокет не дочитав запрос клиента.
Но запрос то к этому времени уже прочитан.

Другого я не знаю, а хотелось бы знать.

oleg_2
() автор топика
Ответ на: комментарий от gena2x

Моему клиенту не нужна страница,
А была б полезней минус единица.

Ну вот и рифмы получились.

Он, клиент, робот.

Клиент воспринимает HTTP-заголовок,
а всё после заголовка - поток байтов.
И тут уж не приделать страницу с ошибкой.
(предполагалось сразу перекачивать данные
из одного сокета в другой).

За отклик спасибо.
Но первичный вопрос всё же остался
не отвеченный:
Вопрос.
Возможно ли ... вернул бы -1.
Меня, на худой конец, устроил бы
и отрицательный ответ - Что ж, менять подход.
Например, отправить срочное сообщение.
Я этого еще не делал, но думаю это возможно.
Раз уж все равно переделывать клиента.

oleg_2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.