![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Всем привет! Нужна ваша помощь.
не могу разобраться с несколькими вещами: 1. Как передать собственную структуру через WSASend и получить на другом конце при помощи WSARecv? 2. Как используя технологию порта завершения вклинить передачу файлов? -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
что значит "вклинить"?
этот вопрос подразумевает пересказ книги по сетевому программированию, можно конкретней? |
||||
|
|||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Давай подробнее!
1. Есть несколько команд для передачи, send и WSASend. как передать при помощи команды Send я знаю. У команды WSASend есть так называемый WSABUF у которого только два параметра buf и len. Мне надо передавать более сложную структуру, но как это сделать незнаю. 2. Смотрел множество примеров как передавать файл по сети, от простого чтения кусками и отправки командой send или WSASend, до использования команды TransmitFile. Хочется использовать TransmitFile, но не могу понять как его можно совместно использовать с портом завершения. Раньше я делал так, отправлял структуру с данными о файле, а потом сразу в цикле или через отдельный поток передавал файл. На другой стороне сначала ловил структуру, после чего в цикле ловил поступающие файлы. Но это простая реализация. Вот как примерный алгоритм реализовать в порте завершения ума не приложу. Вот и прошу помощи, чтобы Вы мне хотябы на пальцах рассказали как это сделать. Заранее спасибо! -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
эта функция принимает LPOVERLAPPED, так-что можно использовать, а для чего тебе порт завершения? точно так-же нужно будет передать структуру с данными о файле, только нужно будет связать с сокетом порт завершения а так-же передать в ф-ю WriteFile(или WSASend) структуру OVERLAPPED. Как только на порт завершения придет пакет завершения, тебе нужно будет передать файл с помощью ф-ии WriteFile(или WSASend) новую структуру OVERLAPPED и тд... |
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Использую порт завершения, так как сервер должен обрабатывать примерно 1000 одновременно подключенных абонентов.
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
попробуй для начала разобраться с портами завершения в более простом случае, например реализуй чтение и запись файлов, в общем это не тот механизм который я могу описть в одном посте на форуме. В принципе там все просто, нужно создать порт завершения, затем связать хэндл с этим портом завершения, например хэндл файла, при этом с этим хэндлом связывается произвольная структура данных, completion key. Для каждого файла или сокета создается свой completion key. Далее ты можешь начать операцию ввода вывода, например вызвав ф-ю WriteFile, и передав в нее указатель на структуру OVERLAPPED, которая содержит смещение для операции ввода вывода и указатель на событие(Event). Эта структура своя для каждой операции, с ее помощью можно понять какая именно операция ввода-вывода завершилась. Что-бы передавать какую либо специфическую информацию, с этой структурой обычно поступают так:
когда завершается очередная операция ввода вывода, ты можешь получить completion key и структуру overlapped, те информацию позволяющую определить на каком объекте, и что за операция завершилась, с помощью ф-ии GetQueuedCompletionStatus. В общем читай MSDN, статей в интернете то-же много. |
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Lazin, я почитал данную ссылку http://forum.vingrad.ru/forum/topic-243054.html
и там выяснилось, что boost:asio, использует тоже порт завершения. Рекомендуешь? все то что я описывал в нем можно реализовать? прием/отправка сообщений, прием отправка файлов? Можешь поделиться основными ссылками, как реализовать мои пожелания? Это сообщение отредактировал(а) vikaz - 11.1.2009, 07:22 -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
REZiaMIX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Пусть я не Lazin , могу тут ответить - да -------------------- ![]() |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
||||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Ох, спасибо. БУДУ СМОТРЕТЬ!!!! А насчет безопасности, там все нормально реализовано?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
есть поддержка ssl
|
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
здорово. А инфу по данной компоненте можно найти только по тем сайтам, которые ты сбросил? или по примерам?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
это ссылка на официальную документацию, там есть примеры
|
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
ладно, посмотрю, там будет видно, вопросы точно будут.
![]() -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
Lazin,
реализация для Linux что использует? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
Lazin,
тут написано
в любой асинхронной по сути модели никаких блокировок не должно быть вообще это раз во-вторых, я не вижу здесь асинхронности есть свзяка неблокирующей модели с концепцией опроса -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
зачем-же так категорично? Это один из возможных вариантов использования, можно не вызывать io_service::run(), а вместо этого вызвать io_service::pool() ![]() в двух словах можно описать принцип работы 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-ов итд. Даже можно сказать что это обычная практика. ![]()
|
||||
|
|||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
Lazin,
ok блокирования нет если используем ::pool но я в упор не вижу асинхронности все операции I/O синхронны по отношению к вызову ::pool ::run -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
вызовы обработчиков синхронны по отношению к вызову ::pool ::run, сами операции выполняются асинхронно
вообще, как по твоему выглядит полностью асинхронная работа? |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
ок как в Linux это реализовано? epoll - это просто навороченный мультиплексор I/O никакой асинхронной работы он не выполняет асинхронная модель I/O (процессы aio/x) не определена для сокетов Добавлено через 10 минут и 33 секунды формируем iocb (I/O Control Block), где описываем что и как нам нужно сделать (в частности куда сохранить/откуда считать данные) вызываем что-то наподибие io_submit, которая начинает асинхронную операцию далее через сигнал/асинхронный вызов обработчика ядро информирует нас о завершении операции (т. е данные уже находятся в юзерском буфере) генерация сигнала по определению асинхронна по отношению к потоку выполнения пользовательского кода так же можно вызвать что-то наподобие io_getevents для получения всех выполненных операций -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
ё-маё.....
Еще вопрос. Для того чтобы использовать в Builder'e эти компоненты, мне просто надо подключить h, hpp файлы, или придется еще "с бубном танцевать" (т.е. делать дополнительные действия)? -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
то-есть это что-то вроде callback ф-ии, только асинхронно, ее вызывает ядро по аппаратному прерыванию? Но это уже более низкий уровень, ASIO - высокоуровневый фреймверк для написания асинхронных приложений, это надстройка над тем, что ты описал. Т.е. когда ядро информирует о завершении асинхронной операции библиотеку, библиотека добавляет наш обработчик в очередь и ждет вызова ::run ::pool или вызова деструктора io_service-a, и вызывает по очереди накопившиеся обработчики. В windows это вообще по другому работает, ядро никогда не вызывает никаких обработчиков(которые могут неизвестно сколько по времени работать), а просто добавляет в очередь(порт завершения) пакет завершения(с данными которые мы ассоциировали с этой операцией), задача программы считывать эти пакеты завершения и интерпретировать их. Это по твоему не асинхронность? Добавлено через 38 секунд я не уверен что Builder вообще сможет работать с boost-ом |
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Мда, здорово, больше мне нечего сказать..... а почему не уверен? неужели только с Visual? -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
только прерывания здесь не причем
как информирует? меня интересует именно Linux, т. к там асинхронная модуль не поддерживается для сокетов единственная возможность асинхронного уведомления - сигнал (SIGIO) и установка O_ASYNC на дескрипторе сокета тогда к чему вообще epoll? Добавлено через 2 минуты и 39 секунд данные к этому моменту уже находятся в нашем буфере? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
да
я не знаю как оно работает под linux, в документации сказано что через epool builder плохо поддерживает стандарт с++, boost по идее работает, но через одно место, лучше использовать Visual Studio или gcc |
|||
|
||||
vikaz |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Попробовал я вчера запустить boost:asio на Builder 2009. То что скачал с сайта у меня не пошло, но с 2009 ставится свой boost версии 1.35.
Подключил к нему boost/asio.hpp, и все, компилятор стал выдавать ошибку за ошибкой при компиляции:
Курсор переместился в файл auto_link.hpp на строчку #pragma defineonoption BOOST_BORLAND_DEBUG -v не долго думая, я удалил -v и вместо него поставил пробел, и компилятор стал работать нормально. ![]() стал проверять примеры. Пример ECHO сервера и ECHO клиента заработали без проблем, а вот код ЧАТА у меня заработал не полностью. Сервер запустился, а у клиента компилятор отказался компилировать строку с запуском нового потока:
Какая именно была ошибка я уже не помню. Единственное я еще не проверил как работает порт завершения, наверное проверю сегодня. Но если честно, я не в большом восторге от компоненты, возможно это просто потому, что я не разобрался в ней полностью и не знаю всех плюсов. ![]() -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
||||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Ясно, теперь понятно....
![]() -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
vikaz, используй 2009 Борман - в нем boost есть.
|
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
mrbrooks, спасибо, я это знаю. Я же раньше написал это.
![]() -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
||||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Я все таки решил остановиться на порте завершения, написанного руками.
Вопрос. Как отправлять и принимать сообщения, допустим, 300Кб. Отправка и получение сообщения осуществляется порциями по 1024 байта. Как отправить от клиент это понятно, просто в цикле. Но вот как принять все это при учете, что одновременно отправляют примерно 1000 клиентов, ума не приложу. Как не запутаться в приеме, кому что принадлежит..... -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
можно сразу отправлять 300 кб
для каждого клиента у тебя будет свой сокет, ты с ним свяжешь разные completion keys а потом просто пишешь демультиплексор, который по completion key завершенной операции определяет какому клиенту принадлежать данные |
||||
|
|||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Lazin, вот уже не в первый раз упоминается completion keys, есть ссылка на описание. А то весь код который я видел, этот параметр не используется.
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
|
||||
|
|||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Lazin у меня к тебе еще вопросик, что это за тип такой: PULONG_PTR?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
REZiaMIX |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
-------------------- ![]() |
||||||
|
|||||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
REZiaMIX, спасибо.
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: нет Всего: 12 |
Как на сервер можно узнать ip адрес подключаемого абонента?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
vikaz,
getpeername() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |