The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Сокеты в С//С++ чтение данных"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Сокеты в С//С++ чтение данных"  +/
Сообщение от Heretic (ok) on 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?


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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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


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

пожалуйста

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Сокеты в С//С++ чтение данных"  +/
Сообщение от Heretic (ok) on 12-Дек-10, 23:37 
Спасибо что ответили.

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

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

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

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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


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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Сокеты в С//С++ чтение данных"  +/
Сообщение от Heretic (ok) on 13-Дек-10, 23:00 
Благодарю.

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру