crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вопрос по сокету-2
oleg_2
  опции профиля:
сообщение 29.11.2009, 16:30
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 25.7.2009
Пользователь №: 943

Спасибо сказали: 1 раз(а)




Репутация:   0  


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

Язык СИ
ОС UNIX

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

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

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

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

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

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

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

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

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


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.11.2009, 19:45
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Раз ты работаешь поверх TCP, значит у тебя есть свой аля протокол передачи данных, вот в нем и отсылай сообщение об ошибке.
Или просто закрывай соединение и все.

Если это не подходит, то объясни для чего именно тебе нужно в read получить -1? Просто если идет ошибка работы с сокетама, то нужно обрабатывать ошибки. Если ошибки на стороне сервера, например подготовки пакета, то нужно делать надстройку, которая сообщит об этом клиенту...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
oleg_2
  опции профиля:
сообщение 30.11.2009, 8:19
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 25.7.2009
Пользователь №: 943

Спасибо сказали: 1 раз(а)




Репутация:   0  


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

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

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

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

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


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.11.2009, 9:06
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Я делал подобное же, только с оберткой поверх TCP.
Что вроде:
struct Packege
{
   int nLenPackage;
   int nLenData;
   int nCommand;
   int nError;
   char *pData;
};
И подобными пакетами обменивался между клиентом и сервером. В nCommand передавал команды, что нужно сделать тому или другому, nError - ошибки, если таковые были, на параллельном сокете...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 8:51