Доброго дня суток.Экспериментирую с сокетами на Сях. Никак не могу понять как получить конец данных при использовании read.
Т.е:Какие то действия ...
...
while (true) {
switch (nread=read(client_fd,buf,sizeof(buf))) {
case 0:
printf("конец\r\n");
break;
case -1:
printf("error\r\n");
break;
default:
printf(buf);
continue;}
}
...
Продолжаю какие то действия.После чтения всех данных сокет продолжает принимать данные, т.е. не может попасть в case 0;
Пробовал сделать не блокируемый сокет, но тогда после пересылки всех данных он попадает в case -1;Как в блокируемом сокете добиться конца передачи данных, т.е. попасть в case 0?
Или нужно реализовывать самому конец данных, что то типа bye?
Спасибо за ответы.
> После чтения всех данных сокет продолжает принимать данные, т.е. не может попасть
> в case 0;
> Пробовал сделать не блокируемый сокет, но тогда после пересылки всех данных он
> попадает в case -1;
> Как в блокируемом сокете добиться конца передачи данных, т.е. попасть в case
> 0?
> Или нужно реализовывать самому конец данных, что то типа bye?1 вы уже сказали
2 нужно чтобы сервер закрыл соединение сам
3 нужно в клиенте организовать отслеживание тайм аута.
> Спасибо за ответы.пожалуйста
Спасибо что ответили.> 1 вы уже сказали
Не понял :) Что именно я сказал :)
> 2 нужно чтобы сервер закрыл соединение сам
> 3 нужно в клиенте организовать отслеживание тайм аута.Сервер закрывает соединение, но должен пройти диалог, клиент посылает данные, сервер соответственно читает их. Так вот сервер блокируется на чтении данных и не понимает когда данные заканчиваются, а сокеты EOF не понимают.
Как я понял можно сделать так, 1. отслеживать конец сообщения с помощью какого нибудь ключевого символа//слова;
2. посылать сначала размер данных которые будут получены и после получения принимать основные данные основываясь на размере завершать прием данных.
> Спасибо что ответили.
>> 1 вы уже сказали
> Не понял :) Что именно я сказал :)"ли нужно реализовывать самому конец данных"
в строковых протоколах это конец линии.
>> 2 нужно чтобы сервер закрыл соединение сам
>> 3 нужно в клиенте организовать отслеживание тайм аута.
> Сервер закрывает соединение, но должен пройти диалог, клиент посылает данные, сервер соответственно
> читает их. Так вот сервер блокируется на чтении данных и не
> понимает когда данные заканчиваются, а сокеты EOF не понимают.
> Как я понял можно сделать так, 1. отслеживать конец сообщения с помощью
> какого нибудь ключевого символа//слова;
> 2. посылать сначала размер данных которые будут получены и после получения принимать
> основные данные основываясь на размере завершать прием данных.можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а что бы его разработать изучите уже существующие. простенькие какие нибудь.
но отслеживать тайм аут необходимо в любой операции чтения, тк нарушения работы протокола могут происходить всегда.
Благодарю.> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
> что бы его разработать изучите уже существующие. простенькие какие нибудь.Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу, для дальнейшего вкуривания :)?
Роясь на просторах интернета я нашел следующее:
>Сервер должен либо знать этот размер, либо
>уметь определить его конец, чтобы быть уверенным в получении его целиком. Это определяется
>протоколом. Например, некоторые протоколы использует в качестве метки конца строку
>"/r/n/r/n". Или можно передатьразмер от клиента первыми байтами пакета. Какой способ
>выбрать, решать придётся Вам, но что-то должно быть обязательно.
> Благодарю.
>> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
>> что бы его разработать изучите уже существующие. простенькие какие нибудь.
> Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу,
> для дальнейшего вкуривания :)?хорошая книга Шон Уолтон Создание сетевых приложенией в среде Linux Руководство разработчика
и для перл программирования Линкольн Штайн Разработка сетевых программ на Perlперл просто незаменим когда надо быстренько сверстать какой нибудь макет. а также написать клиента имитирующего работу удаленной стороны.
>> Благодарю.
>>> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
>>> что бы его разработать изучите уже существующие. простенькие какие нибудь.
>> Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу,
>> для дальнейшего вкуривания :)?
> хорошая книга Шон Уолтон Создание сетевых приложенией в среде Linux Руководство разработчика
> и для перл программирования Линкольн Штайн Разработка сетевых программ на Perl
> перл просто незаменим когда надо быстренько сверстать какой нибудь макет. а также
> написать клиента имитирующего работу удаленной стороны.Спасибо большое. То что нужно, у меня как раз взаимодействие с Perl :)