URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8962
[ Назад ]

Исходное сообщение
"Сокеты в С//С++ чтение данных"

Отправлено Heretic , 12-Дек-10 21:34 
Доброго дня суток.

Экспериментирую с сокетами на Сях. Никак не могу понять как получить конец данных при использовании 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?


Спасибо за ответы.


Содержание

Сообщения в этом обсуждении
"Сокеты в С//С++ чтение данных"
Отправлено NuINu , 12-Дек-10 23:17 
> После чтения всех данных сокет продолжает принимать данные, т.е. не может попасть
> в case 0;
> Пробовал сделать не блокируемый сокет, но тогда после пересылки всех данных он
> попадает в case -1;
> Как в блокируемом сокете добиться конца передачи данных, т.е. попасть в case
> 0?
> Или нужно реализовывать самому конец данных, что то типа bye?

1 вы уже сказали
2 нужно чтобы сервер закрыл соединение сам
3 нужно в клиенте организовать отслеживание тайм аута.


> Спасибо за ответы.

пожалуйста


"Сокеты в С//С++ чтение данных"
Отправлено Heretic , 12-Дек-10 23:37 
Спасибо что ответили.

> 1 вы уже сказали

Не понял :) Что именно я сказал :)

> 2 нужно чтобы сервер закрыл соединение сам
> 3 нужно в клиенте организовать отслеживание тайм аута.

Сервер закрывает соединение, но должен пройти диалог, клиент посылает данные, сервер соответственно читает их. Так вот сервер блокируется на чтении данных и не понимает когда данные заканчиваются, а сокеты EOF не понимают.

Как я понял можно сделать так, 1. отслеживать конец сообщения с помощью какого нибудь ключевого символа//слова;
2. посылать сначала размер данных которые будут получены и после получения принимать основные данные основываясь на размере завершать прием данных.


"Сокеты в С//С++ чтение данных"
Отправлено NuINu , 13-Дек-10 22:16 
> Спасибо что ответили.
>> 1 вы уже сказали
> Не понял :) Что именно я сказал :)

"ли нужно реализовывать самому конец данных"
в строковых протоколах это конец линии.


>> 2 нужно чтобы сервер закрыл соединение сам
>> 3 нужно в клиенте организовать отслеживание тайм аута.
> Сервер закрывает соединение, но должен пройти диалог, клиент посылает данные, сервер соответственно
> читает их. Так вот сервер блокируется на чтении данных и не
> понимает когда данные заканчиваются, а сокеты EOF не понимают.
> Как я понял можно сделать так, 1. отслеживать конец сообщения с помощью
> какого нибудь ключевого символа//слова;
> 2. посылать сначала размер данных которые будут получены и после получения принимать
> основные данные основываясь на размере завершать прием данных.

можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а что бы его разработать изучите уже существующие. простенькие какие нибудь.

но отслеживать тайм аут необходимо в любой операции чтения, тк нарушения работы протокола могут происходить всегда.


"Сокеты в С//С++ чтение данных"
Отправлено Heretic , 13-Дек-10 23:00 
Благодарю.

> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
> что бы его разработать изучите уже существующие. простенькие какие нибудь.

Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу, для дальнейшего вкуривания :)?


"Сокеты в С//С++ чтение данных"
Отправлено Heretic , 13-Дек-10 23:32 
Роясь на просторах интернета я нашел следующее:
>Сервер должен либо знать этот размер, либо
>уметь определить его конец, чтобы быть уверенным в получении его целиком. Это определяется
>протоколом. Например, некоторые протоколы использует в качестве метки конца строку
>"/r/n/r/n". Или можно передатьразмер от клиента первыми байтами пакета. Какой способ
>выбрать, решать придётся Вам, но что-то должно быть обязательно.

"Сокеты в С//С++ чтение данных"
Отправлено NuINu , 14-Дек-10 18:47 
> Благодарю.
>> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
>> что бы его разработать изучите уже существующие. простенькие какие нибудь.
> Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу,
> для дальнейшего вкуривания :)?

хорошая книга Шон Уолтон Создание сетевых приложенией в среде Linux Руководство разработчика
и для перл программирования Линкольн Штайн Разработка сетевых программ на Perl

перл просто незаменим когда надо быстренько сверстать какой нибудь макет. а также написать клиента имитирующего работу удаленной стороны.


"Сокеты в С//С++ чтение данных"
Отправлено Heretic , 14-Дек-10 23:09 
>> Благодарю.
>>> можно, все можно, разработайте сначала протокол, по которому вы будете обмениваться. а
>>> что бы его разработать изучите уже существующие. простенькие какие нибудь.
>> Отличный совет, не кинете ли URL на документацию, или посоветует какую книгу,
>> для дальнейшего вкуривания :)?
> хорошая книга Шон Уолтон Создание сетевых приложенией в среде Linux Руководство разработчика
> и для перл программирования Линкольн Штайн Разработка сетевых программ на Perl
> перл просто незаменим когда надо быстренько сверстать какой нибудь макет. а также
> написать клиента имитирующего работу удаленной стороны.

Спасибо большое. То что нужно, у меня как раз взаимодействие с Perl :)