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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порт завершения, Сетевое программирование в среде Windows 
:(
    Опции темы
vikaz
Дата 8.1.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет! Нужна ваша помощь.
не могу разобраться с несколькими вещами:
1. Как передать собственную структуру через WSASend  и получить на другом конце при помощи WSARecv?
2. Как используя технологию порта завершения вклинить передачу файлов?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 8.1.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vikaz @  8.1.2009,  09:08 Найти цитируемый пост)
2. Как используя технологию порта завершения вклинить передачу файлов? 

что значит "вклинить"?
Цитата(vikaz @  8.1.2009,  09:08 Найти цитируемый пост)
1. Как передать собственную структуру через WSASend  и получить на другом конце при помощи WSARecv?

этот вопрос подразумевает пересказ книги по сетевому программированию, можно конкретней?
PM MAIL Skype GTalk   Вверх
vikaz
Дата 8.1.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Давай подробнее!
1. Есть несколько команд для передачи, send и  WSASend.  как передать при помощи команды Send я знаю. У команды WSASend есть так называемый WSABUF у которого только два параметра buf и len. Мне надо передавать более сложную структуру, но как это сделать незнаю. 
2. Смотрел множество примеров как передавать файл по сети, от простого чтения кусками и отправки командой send или WSASend, до использования команды TransmitFile. Хочется использовать TransmitFile, но не могу понять как его можно совместно использовать с портом завершения. 
Раньше я делал так, отправлял структуру с данными о файле, а потом сразу в цикле или через отдельный поток передавал файл. На другой стороне сначала ловил структуру, после чего в цикле ловил поступающие файлы. Но это простая реализация. Вот как примерный алгоритм реализовать в порте завершения ума не приложу.
Вот и прошу помощи, чтобы Вы мне хотябы на пальцах рассказали как это сделать. 
Заранее спасибо!



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 8.1.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vikaz @  8.1.2009,  13:37 Найти цитируемый пост)
Хочется использовать TransmitFile, но не могу понять как его можно совместно использовать с портом завершения. 

эта функция принимает LPOVERLAPPED, так-что можно использовать, а для чего тебе порт завершения?

Цитата(vikaz @  8.1.2009,  13:37 Найти цитируемый пост)
Раньше я делал так, отправлял структуру с данными о файле, а потом сразу в цикле или через отдельный поток передавал файл. На другой стороне сначала ловил структуру, после чего в цикле ловил поступающие файлы

точно так-же нужно будет передать структуру с данными о файле, только нужно будет связать с сокетом порт завершения а так-же передать в ф-ю WriteFile(или WSASend) структуру OVERLAPPED. Как только на порт завершения придет пакет завершения, тебе нужно будет передать файл с помощью ф-ии WriteFile(или WSASend) новую структуру OVERLAPPED и тд...
PM MAIL Skype GTalk   Вверх
vikaz
Дата 9.1.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 9.1.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



попробуй для начала разобраться с портами завершения в более простом случае, например реализуй чтение и запись файлов, в общем это не тот механизм который я могу описть в одном посте на форуме. В принципе там все просто, нужно создать порт завершения, затем связать хэндл с этим портом завершения, например хэндл файла, при этом с этим хэндлом связывается произвольная структура данных, completion key. Для каждого файла или сокета создается свой completion key. Далее ты можешь начать операцию ввода вывода, например вызвав ф-ю WriteFile, и передав в нее указатель на структуру OVERLAPPED, которая содержит смещение для операции ввода вывода и указатель на событие(Event). Эта структура своя для каждой операции, с ее помощью можно понять какая именно операция ввода-вывода завершилась. Что-бы передавать какую либо специфическую информацию, с этой структурой обычно поступают так:
Код

struct myOperation : public OVERLAPPED
{
....my data...
};

когда завершается очередная операция ввода вывода, ты можешь получить completion key и структуру overlapped, те информацию позволяющую определить на каком объекте, и что за операция завершилась, с помощью ф-ии GetQueuedCompletionStatus. В общем читай MSDN, статей в интернете то-же много.
PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Lazin, я почитал данную ссылку http://forum.vingrad.ru/forum/topic-243054.html
и там выяснилось, что boost:asio, использует тоже порт завершения.
Рекомендуешь?
все то что я описывал в нем можно реализовать? прием/отправка сообщений, прием отправка файлов?

Можешь поделиться основными ссылками, как реализовать мои пожелания?

Это сообщение отредактировал(а) vikaz - 11.1.2009, 07:22


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
REZiaMIX
Дата 11.1.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vikaz @ 11.1.2009,  07:12)
все то что я описывал в нем можно реализовать? прием/отправка сообщений, прием отправка файлов?

Пусть я не Lazin , могу тут ответить - да


--------------------
user posted image
PM MAIL   Вверх
Lazin
Дата 11.1.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ох, спасибо. БУДУ СМОТРЕТЬ!!!! А насчет безопасности, там все нормально реализовано?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 11.1.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



есть поддержка ssl
PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



здорово. А инфу по данной компоненте можно найти только по тем сайтам, которые ты сбросил? или по примерам?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 11.1.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



это ссылка на официальную документацию, там есть примеры
PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ладно, посмотрю, там будет видно, вопросы точно будут. smile 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 11.1.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Lazin
реализация для Linux что использует?


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

PM MAIL   Вверх
Lazin
Дата 11.1.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  11.1.2009,  12:26 Найти цитируемый пост)
реализация для Linux что использует?

epoll 
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 11.1.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Lazin
тут написано

Цитата

5. Your program must make a call to io_service::run()  (or to one of the similar io_service member functions) in order for the result to be retrieved. A call to io_service::run()  blocks while there are unfinished asynchronous operations, so you would typically call it as soon as you have started your first asynchronous operation. 


в любой асинхронной по сути модели никаких блокировок не должно быть вообще 
это раз
во-вторых, я не вижу здесь асинхронности
есть свзяка неблокирующей модели с концепцией опроса


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

PM MAIL   Вверх
Lazin
Дата 11.1.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  11.1.2009,  12:49 Найти цитируемый пост)
в любой асинхронной по сути модели никаких блокировок не должно быть вообще

зачем-же так категорично? Это один из возможных вариантов использования, можно не вызывать io_service::run(), а вместо этого вызвать io_service::pool() smile 
в двух словах можно описать принцип работы asio так:
есть объекты(потомки класса basic_io_object<Service>), есть обслуживающие их сервисы(потомки io_service::service), если создать объект, то для него будет создан соответствующий сервис, например для boost::asio::ip::tcp::socket будет создан boost::asio::stream_socket_service<tcp>, а для boost::asio::ip::udp::socket - boost::asio::stream_socket_service<udp>, этот сервис добавляется в простой односвязный список внутри io_service-a. 
Далее, пользователь может начинать различные асинхронные операции: send, receive, connect, etc. io_service, с помощью соответствующих сервисов может обращаться к ОС и проверять наличие завершившихся асинхронных операций, далее он извлекает CompletionHandler завершившейся операции и вызывает его(в windows, CompletionHandler хранится в структуре, которая связывается с операцией ввода-вывода с помощью механизма портов завершения). Если вызвать ф-ю io_service::run(), то эта ф-я не завершится до тех пор, пока есть незавершенные операции ввода-вывода, а если вызвать io_service::post(), то будут обработаны все завершенные операции, и ф-я завершит работу. Самое главное - библиотека asio гарантирует вызов всех CompletionHandler-ов всех асинхронных операций, что позволяет хранить в них различные данные, не опасаясь утечек памяти, deadlock-ов итд. Даже можно сказать что это обычная практика. smile 
Код

void completion_handler(size_t bytes_transferred, boost::system::error_code, int* data)
{
    ...
    delete []data;
    ...
}

int *data = new int[sizeofdata];

socket.async_send(boost::buffer(data, sizeofdata), 
                               boost::bind(&completion_handler, placeholders::bytes_transferred, placeholders::error, data) );

io_service.run();//после завершения ф-ии run, массив data будет удален

PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 11.1.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Lazin
ok
блокирования нет если используем ::pool

но я в упор не вижу асинхронности
все операции I/O синхронны по отношению к вызову ::pool ::run


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

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



вызовы обработчиков синхронны по отношению к вызову ::pool ::run, сами операции выполняются асинхронно
вообще, как по твоему выглядит полностью асинхронная работа?
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 11.1.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lazin @  11.1.2009,  14:14 Найти цитируемый пост)
вызовы обработчиков синхронны по отношению к вызову ::pool ::run, сами операции выполняются асинхронно

ок
как в Linux это реализовано?
epoll - это просто навороченный мультиплексор I/O
никакой асинхронной работы он не выполняет

асинхронная модель I/O (процессы aio/x) не определена для сокетов

Добавлено через 10 минут и 33 секунды
Цитата(Lazin @  11.1.2009,  14:14 Найти цитируемый пост)
вообще, как по твоему выглядит полностью асинхронная работа? 

формируем iocb (I/O Control Block), где описываем что и как нам нужно сделать (в частности куда сохранить/откуда считать данные)
вызываем что-то наподибие io_submit, которая начинает асинхронную операцию
далее через сигнал/асинхронный вызов обработчика ядро информирует нас о завершении операции (т. е данные уже находятся в юзерском буфере)
генерация сигнала по определению асинхронна по отношению к потоку выполнения пользовательского кода
так же можно вызвать что-то наподобие io_getevents для получения всех выполненных операций


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

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


Опытный
**


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

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



ё-маё.....
Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 11.1.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  11.1.2009,  14:23 Найти цитируемый пост)
формируем iocb (I/O Control Block), где описываем что и как нам нужно сделать (в частности куда сохранить/откуда считать данные)
вызываем что-то наподибие io_submit, которая начинает асинхронную операцию
далее через сигнал/асинхронный вызов обработчика ядро информирует нас о завершении операции (т. е данные уже находятся в юзерском буфере)
генерация сигнала по определению асинхронна по отношению к потоку выполнения пользовательского кода
так же можно вызвать что-то наподобие io_getevents для получения всех выполненных операций

то-есть это что-то вроде callback ф-ии, только асинхронно, ее вызывает ядро по аппаратному прерыванию?
Но это уже более низкий уровень, ASIO - высокоуровневый  фреймверк для написания асинхронных приложений, это надстройка над тем, что ты описал. Т.е. когда ядро информирует о завершении асинхронной операции библиотеку, библиотека добавляет наш обработчик в очередь и ждет вызова ::run ::pool или вызова деструктора io_service-a, и вызывает по очереди накопившиеся обработчики. 
В windows это вообще по другому работает, ядро никогда не вызывает никаких обработчиков(которые могут неизвестно сколько по времени работать), а просто добавляет в очередь(порт завершения) пакет завершения(с данными которые мы ассоциировали с этой операцией), задача программы считывать эти пакеты завершения и интерпретировать их. Это по твоему не асинхронность?

Добавлено через 38 секунд
Цитата(vikaz @  11.1.2009,  14:36 Найти цитируемый пост)
Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)? 

я не уверен что Builder вообще сможет работать с boost-ом
PM MAIL Skype GTalk   Вверх
vikaz
Дата 11.1.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @ 11.1.2009,  14:54)
Цитата(MAKCim @  11.1.2009,  14:23 Найти цитируемый пост)
формируем iocb (I/O Control Block), где описываем что и как нам нужно сделать (в частности куда сохранить/откуда считать данные)
вызываем что-то наподибие io_submit, которая начинает асинхронную операцию
далее через сигнал/асинхронный вызов обработчика ядро информирует нас о завершении операции (т. е данные уже находятся в юзерском буфере)
генерация сигнала по определению асинхронна по отношению к потоку выполнения пользовательского кода
так же можно вызвать что-то наподобие io_getevents для получения всех выполненных операций

то-есть это что-то вроде callback ф-ии, только асинхронно, ее вызывает ядро по аппаратному прерыванию?
Но это уже более низкий уровень, ASIO - высокоуровневый  фреймверк для написания асинхронных приложений, это надстройка над тем, что ты описал. Т.е. когда ядро информирует о завершении асинхронной операции библиотеку, библиотека добавляет наш обработчик в очередь и ждет вызова ::run ::pool или вызова деструктора io_service-a, и вызывает по очереди накопившиеся обработчики. 
В windows это вообще по другому работает, ядро никогда не вызывает никаких обработчиков(которые могут неизвестно сколько по времени работать), а просто добавляет в очередь(порт завершения) пакет завершения(с данными которые мы ассоциировали с этой операцией), задача программы считывать эти пакеты завершения и интерпретировать их. Это по твоему не асинхронность?

Добавлено @ 14:55
Цитата(vikaz @  11.1.2009,  14:36 Найти цитируемый пост)
Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)? 

я не уверен что Builder вообще сможет работать с boost-ом

Мда, здорово, больше мне нечего сказать..... а почему не уверен? неужели только с Visual?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 11.1.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lazin @  11.1.2009,  14:54 Найти цитируемый пост)
то-есть это что-то вроде callback ф-ии, только асинхронно, ее вызывает ядро по аппаратному прерыванию?

только прерывания здесь не причем

Цитата(Lazin @  11.1.2009,  14:54 Найти цитируемый пост)
Т.е. когда ядро информирует о завершении асинхронной операции библиотеку

как информирует?
меня интересует именно Linux, т. к там асинхронная модуль не поддерживается для сокетов
единственная возможность асинхронного уведомления - сигнал (SIGIO) и установка O_ASYNC на дескрипторе сокета
тогда к чему вообще epoll?

Добавлено через 2 минуты и 39 секунд
Цитата(Lazin @  11.1.2009,  14:54 Найти цитируемый пост)
Это по твоему не асинхронность?

данные к этому моменту уже находятся в нашем буфере?


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

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MAKCim @  11.1.2009,  15:16 Найти цитируемый пост)
данные к этому моменту уже находятся в нашем буфере? 

да

Цитата(MAKCim @  11.1.2009,  15:16 Найти цитируемый пост)
как информирует?
меня интересует именно Linux, т. к там асинхронная модуль не поддерживается для сокетов
единственная возможность асинхронного уведомления - сигнал (SIGIO) и установка O_ASYNC на дескрипторе сокета
тогда к чему вообще epoll?


я не знаю как оно работает под linux, в документации сказано что через epool
builder плохо поддерживает стандарт с++, boost по идее работает, но через одно место, лучше использовать Visual Studio или gcc
PM MAIL Skype GTalk   Вверх
vikaz
Дата 12.1.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробовал я вчера запустить boost:asio на Builder 2009. То что скачал с сайта у меня не пошло, но с 2009 ставится свой boost  версии 1.35. 
Подключил к нему boost/asio.hpp, и все, компилятор стал выдавать ошибку за ошибкой при компиляции:

Код

[BCC32 Warning] error_code.hpp(480): W8104 Local Static with constructor dangerous for multi-threaded apps
[BCC32 Warning] error.hpp(322): W8104 Local Static with constructor dangerous for multi-threaded apps
[BCC32 Warning] error.hpp(346): W8104 Local Static with constructor dangerous for multi-threaded apps
[BCC32 Error] auto_link.hpp(257): E2075 Incorrect pragma directive option: -v
[BCC32 Error] static_log2.hpp(51): E2451 Undefined symbol 'n'
[BCC32 Error] static_log2.hpp(55): E2451 Undefined symbol 'value'
[BCC32 Error] static_log2.hpp(55): E2230 In-line data member initialization requires an integral constant expression
[BCC32 Fatal Error] static_log2.hpp(49): F1004 Internal compiler error at 0x6e757a7 with base 0x6de0000

Курсор переместился в файл auto_link.hpp на строчку 
#pragma defineonoption BOOST_BORLAND_DEBUG -v

не долго думая, я удалил -v и вместо него поставил пробел, и компилятор стал работать нормально. smile
стал проверять примеры. Пример ECHO сервера и ECHO  клиента заработали без проблем, а вот код ЧАТА у меня заработал не полностью.
Сервер запустился, а у клиента компилятор отказался компилировать строку с запуском нового потока:

Код

...
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
...

Какая именно была ошибка я уже не помню.

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


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 12.1.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



это не компонент, это библиотека, строчка с 
Цитата(vikaz @  12.1.2009,  08:30 Найти цитируемый пост)
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

не будет работать так как ты не собрал boost, а boost::thread не header only библиотека
PM MAIL Skype GTalk   Вверх
vikaz
Дата 12.1.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ясно, теперь понятно.... smile


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
mrbrooks
Дата 12.1.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



vikaz, используй 2009 Борман - в нем boost есть.
PM MAIL   Вверх
vikaz
Дата 12.1.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mrbrooks, спасибо, я это знаю. Я же раньше написал это. smile


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
mrbrooks
Дата 13.1.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(vikaz @  12.1.2009,  14:45 Найти цитируемый пост)
Я же раньше написал это. smile 

Точно. Пардон  smile 
PM MAIL   Вверх
vikaz
Дата 15.1.2009, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я все таки решил остановиться на порте завершения, написанного руками.
Вопрос. 
Как отправлять и принимать сообщения, допустим, 300Кб.
Отправка и получение сообщения осуществляется порциями по 1024 байта.
Как отправить от клиент это понятно, просто в цикле. Но вот как принять все это при учете, что одновременно отправляют примерно 1000 клиентов, ума не приложу. Как не запутаться в приеме, кому что принадлежит.....


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 15.1.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vikaz @  15.1.2009,  07:13 Найти цитируемый пост)
Отправка и получение сообщения осуществляется порциями по 1024 байта.

можно сразу отправлять 300 кб

Цитата(vikaz @  15.1.2009,  07:13 Найти цитируемый пост)
Но вот как принять все это при учете, что одновременно отправляют примерно 1000 клиентов, ума не приложу. Как не запутаться в приеме, кому что принадлежит..... 

для каждого клиента у тебя будет свой сокет, ты с ним свяжешь разные completion keys а потом просто пишешь демультиплексор, который по completion key завершенной операции определяет какому клиенту принадлежать данные
PM MAIL Skype GTalk   Вверх
vikaz
Дата 15.1.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Lazin, вот уже не в первый раз упоминается completion keys, есть ссылка на описание. А то весь код который я видел, этот параметр не используется.


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Lazin
Дата 15.1.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MSDN)

GetQueuedCompletionStatus

The GetQueuedCompletionStatus function attempts to dequeue an I/O completion packet from the specified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation associated with the completion port to complete.


Код

BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,
  LPDWORD lpNumberOfBytes,
  PULONG_PTR lpCompletionKey,
  LPOVERLAPPED* lpOverlapped,
  DWORD dwMilliseconds
);


lpCompletionKey 
[out] Pointer to a variable that receives the completion key value associated with the file handle whose I/O operation has completed. A completion key is a per-file key that is specified in a call to CreateIoCompletionPort. 
lpOverlapped 
[out] Pointer to a variable that receives the address of the OVERLAPPED structure that was specified when the completed I/O operation was started. 

PM MAIL Skype GTalk   Вверх
vikaz
Дата 16.1.2009, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Lazin   у меня к тебе еще вопросик, что это за тип такой: PULONG_PTR?



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
REZiaMIX
Дата 16.1.2009, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vikaz @ 16.1.2009,  08:00)
Lazin   у меня к тебе еще вопросик, что это за тип такой: PULONG_PTR?

Код

#if defined(_WIN64)
    typedef __int64 INT_PTR, *PINT_PTR;
    typedef unsigned __int64 UINT_PTR, *PUINT_PTR;

    typedef __int64 LONG_PTR, *PLONG_PTR;
    typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;

    #define __int3264   __int64

#else
    typedef _W64 int INT_PTR, *PINT_PTR;
    typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

    typedef _W64 long LONG_PTR, *PLONG_PTR;
    typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

    #define __int3264   __int32

#endif


Код

typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;



--------------------
user posted image
PM MAIL   Вверх
vikaz
Дата 16.1.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



REZiaMIX, спасибо. 



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 16.1.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как на сервер можно узнать ip адрес подключаемого абонента?
 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Олег2005
Дата 18.1.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



vikaz
getpeername()
PM MAIL WWW MSN   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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