Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неблокируемая отправка, через сокет 
V
    Опции темы
GrayCardinal
  Дата 2.10.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Как реализуется ? Знаю что есть poll, который может проверить когда можно отправлять, знаю что send на "неблокируемый" сокет вернет сколько байт отправлено... Т.е. мне надо хранить кучу PTR'ов и организовывать логику отправки "по кусочкам"...... Вопрос - как это сделать по-людски ? Сделать в смысле следующее :
1. Есть дескриптор, в который отправляем файлО. (гигов эдак десять).
2. Есть второй дескриптор, который должен в интерактивном режиме реагировать на команды. 
Чего делать ?

Доп. условия :
Поток отправки не создавать. Ну не нужен мне лишний процесс  smile 





Это сообщение отредактировал(а) GrayCardinal - 2.10.2006, 13:44


--------------------
PM MAIL WWW   Вверх
ZeusAtVingrad
Дата 2.10.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.4.2006

Репутация: нет
Всего: нет



Может select'ом следить за обоими дескрипторами?
PM MAIL   Вверх
MAKCim
Дата 2.10.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Доп. условия :
Поток отправки не создавать. Ну не нужен мне лишний процесс 

а чего так, вроде при COW создание процесса не так расточительно
а вообще может так с select-ом
Код

int socket_id, interactive_id;
...
fd_set read_set, write_set;
int max_id = socket_id > interactive_id ? socket_id + 1: 
    interactive_id + 1;
struct timeval tv = { 0 };
while (1)
{
    FD_ZERO(&read_set);
    FD_ZERO(&write_set);
    FD_SET(socket_id, &write_set);
    FD_SET(interactive_id, &read_set);
    select(max_id, &read_set, &write_set, NULL, &tv); /* не блокируется */
    if (FD_ISSET(interactive_id, &read_set))
    {
         /* читаем, выполняем интерактивные команды */
    }
    if (FD_ISSET(socket_id, &write_set))
    {
        /* отправляем очередную порцию данных через сокет */
    }
}

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

Это сообщение отредактировал(а) MAKCim - 2.10.2006, 15:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
smalcom
Дата 2.10.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



без лишнего процесса мона юзать sleep(MAX_DWORD) который совсем не жрет процессор. чем не нравится создать новый тред или вкинуть select в while(true)


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
dmiceman
Дата 3.10.2006, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



варианты:

1. select()/poll() (это одно и тоже)
2. спать по милисекундам
3. треды
4. ловить SIGIO выставив сокет в O_ASYNC (никогда таким извращением не занимался)
5. форкаться, делать в дите всю работу и умирать

при всем богатстве выбора, альтернативы вариантам 1 и 3 нет. 5 -- по обстоятельствам.
PM MAIL   Вверх
GrayCardinal
Дата 3.10.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



MAKCim
Как определять размер "очередной порции", чтоб небыло блокировки ?

Добавлено @ 08:55 
dmiceman
Меня именно интересует вариант реализации при помощи select/poll. Если я после select что-то оправлю и канал окажется уже, прога у меня заблокируется до окончания передачи  smile 


--------------------
PM MAIL WWW   Вверх
smalcom
Дата 3.10.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



а если вынести отправку в отдельный тред, то все будет в порядке


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
GrayCardinal
Дата 3.10.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



smalcom
Предлагаешь создавать тред, который 99.99% своего времени будет простаивать (ожидая завершения отправки) ?  smile 


--------------------
PM MAIL WWW   Вверх
smalcom
Дата 3.10.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



пусть себе стоит он шо мешает. а во вторых почему стоит?


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
GrayCardinal
Дата 3.10.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



smalcom
Ну не лежит же  smile 


--------------------
PM MAIL WWW   Вверх
smalcom
Дата 3.10.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



как тока упадет бум его пороть


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
dmiceman
Дата 3.10.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 9.9.2006

Репутация: нет
Всего: нет



Цитата(GrayCardinal @ 3.10.2006,  08:53)
Добавлено @ 08:55 
dmiceman
Меня именно интересует вариант реализации при помощи select/poll. Если я после select что-то оправлю и канал окажется уже, прога у меня заблокируется до окончания передачи  smile

ты не можешь определить размер рабочей порции. то есть тебе нужно иметь буфер отправки и буфер приема. писать и читать в дескрипторы следует в неблокирующем режиме (O_NONBLOCK). read() и write() для того и возвращают размер принятых/отправленных байт. и на оба дескриптора сажается select() в цикле.

потом, если в командный дескриптор пришла полная команда -- обрабатывай. как ты будешь определять полная ли это команда сидит в буфере -- зависит от задачи. большинство демонов с текстовым интерфейсом (pop3, ftp, smtp) разделяют команды переводами строк.

вот приблизительно так. просто -- не получится. как минимум пара сот строчек кода.
PM MAIL   Вверх
MAKCim
Дата 3.10.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Как определять размер "очередной порции", чтоб небыло блокировки ?

Поставь O_NONBLOCK на сокет
Насколько я знаю для каналов в этом случае возможна частичная запись если размер передаваемых данных больше текущей вместимости буфера. По идее с сокетами тоже должно работать, но не уверен
Еще по-моему в настройках сокета с помощью setsockopt можно указать нижнию границу объема передаваемых данных, и если количество данных меньше чем это граничное значение, write на сокете не блокируется
Цитата

Предлагаешь создавать тред, который 99.99% своего времени будет простаивать (ожидая завершения отправки) ?

Мне кажется все таки использование здесь потоков/процессов логичнее, имхо, конечно

Это сообщение отредактировал(а) MAKCim - 3.10.2006, 17:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 5.10.2006, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Угу. Всем спасибо... Остановился на варианте с вилкой. Написал Dtransmit которая файло перекидывает и забыл  про траблу smile И не волнует что она в другом процессе выполняется smile 


--------------------
PM MAIL WWW   Вверх
Нонейм
Дата 10.10.2006, 09:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Асинхронный ввод-вывод: aio_xxx
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.