![]() |
|
Модераторы: feodorv |
![]()
|
|
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Доброго времени суток! Собственно интересует как лучше сделать передачу векторов (wstring) используя чистые сокеты (Win Api)
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Вектор по сети не передается. Для этого клиент и сервер договариваются о конкретном формате данных, который будет передаваться и посылают данные в этом формате. Это может быть XML или просто текст, разделенный каким-то специальным символом..это уже тебе решать. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
так:
http://liveworkspace.org/code/c3601e80b7d4...36c56a54522dc21 |
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
boostcoder, спасибо большое. Как я вижу буст переделывает вектор в бинарные данные. Тогда еще один вопросец... а как обратно то?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
так:
http://liveworkspace.org/code/697afcd05c8b...a79ee2559aa90e3 |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 1 Всего: 10 |
boostcoder, а он адекватно восстановится на другом компьютере или хотя бы в другом процессе при учете аллокаторов и прочих прелестей string и vector?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
| Kirgston |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Хм... если например зашифровать стринг и сразу же расшифровать - всё хорошо. Если же при этом передать по сети шифрованный вариант и попытаться расшифровать то вылетит эксепшен на "catch stream_error archive exceptions will cause invalid_signature archive exception to be thrown below" . А именно оно не может найти дочерних элементов. Вот код отсылки сообщения с сервера:
Вот код приема данных в клиенте:
Вот собственно класс дешифрации:
И класс шифрации:
я вот только не пойму... проблемы у меня или это так и задумано чтобы зашифровать и сразу же расшифровать? |
||||||||||
|
|||||||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Изменил. Результат такой же. В файле basic_binary_iarchive.ipp в коде:
Срабатывает кэтч. При заходе в this->This()->load(l) . Данная ф-ция должна возвратить указатель на класс Archive. Но при static_cast<Archive *>(this); случается ошибка т.к. this как я понял пустой о_О |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
убедитесь что str.length() == str.size() Добавлено @ 22:38 собственно это говорит о том, что у вас ошибка в транспорте. Добавлено @ 22:42 епс..дурацкая ассоциация осталась от работы с некоторым строковым типом. бред написал Добавлено @ 22:44 что-то я не понял...как вы при приеме определяете сколько нужно прочесть? Это сообщение отредактировал(а) boostcoder - 23.11.2010, 23:12 |
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
boostcoder, кажется я понял в чем причина... дело в том что после кодирования буфер становится чуток странным. То есть идет какой то символ потом несколько элементов NULL а потом уже сигнатура.
Вот пример: ![]() Собственно это есть как на сервере так и в клиенте. Вот и наверно когда код натыкается на первый NULL сигнатура и откидывается |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
правильно. вы ведь используете бинарную сериализацию. а в ней не обязаны быть только текстовые данные. чтоб корректно передавать и принимать бинарные массивы, нужно сначала передавать размер этого массива. принимающая сторона считывая этот размер, знает сколько данных нужно причитать следом из сокета. |
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
В принципе всё уже решил кроме одного... чтобы "состыковать" те же строки или просто бинарные данные можно использовать memcpy. так вот... а есть какой то аналог для std::string? Не хочу просто изобретать муть с динамической памятью . А обычный "+= " и подобные сразу режут строку при первом NULL.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
Добавлено через 1 минуту и 20 секунд ну или std::string::assign(). зависит от задачи... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |