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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разные типы данных в сокет, как передать в одном сообщении 
V
    Опции темы
knopka
Дата 17.11.2008, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



сообщение передаваемое в сокет состоит из двух частей:
  • заголовка из  нескольких unsigned int полей 
  •  и текста
всё это должно передаваться в одном сообщении
Скажите пожалуйста как это лучше сделать 
Заранее спасибо

PM MAIL ICQ   Вверх
Andrey44
Дата 17.11.2008, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Создай структуру, и ее передавай.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
knopka
Дата 17.11.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я так и делал, 
но со структурой приходит несколько символов, а должно быть явно  больше,
идеальным для меня было бы передача в формате вектор <char> 
но немогу сконвертировать структуру хотя бы в char
PM MAIL ICQ   Вверх
mrbrooks
Дата 17.11.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



knopka, ты бы код выложил. Достаточно твоего буфера и функций send(), recv(). 
PM MAIL   Вверх
REZiaMIX
Дата 17.11.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Должно быть приблизительно так(в полупсевдокодеsmile ):
Код

struct packet{
char string[512];
}a;
recv(socket,(char*)&a,sizeof(a),NULL);
// отправка так
strcpy(a.string,"hello world!!!");
send(socket,(char*)&a,sizeof(a),NULL);

Или более гибкий вариант:
Код

struct packet{
uint len;
char*string;
}a;
recv(socket,(char*)&a,len,sizeof(a.len),NULL);
a.string = new char[a.len];
... обработка
delete [] a.string;
// отправка
char string[] = "Hello World!!!";
a.string = new char[strlen(string)];
strcpy(a.string,string);
a.len = strlen(string);
send(socket,(char*)&a,sizeof(a),NULL);

При передаче строки надо учитывать что она прийдет без \0.

Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 10:13


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


Бывалый
*


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

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



to REZiaMIX 
Спасибо за помощь.
Цитата

... обработка

а как обработать ответное сообщение?
вид сообщения: �▒��趣��pW��������
первые четыре это len? а остальные string как их извлечь из буфера?

Добавлено через 6 минут и 2 секунды
а после отправки надо делать 
Цитата

delete [] a.string;

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


Опытный
**


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

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



Цитата(knopka @ 17.11.2008,  12:06)
to REZiaMIX 
Спасибо за помощь.

а как обработать ответное сообщение?
вид сообщения: �▒��趣��pW��������
первые четыре это len? а остальные string как их извлечь из буфера?

Добавлено @ 12:12
а после отправки надо делать 
Цитата

delete [] a.string;

Цитата

первые четыре это len? а остальные string как их извлечь из буфера?

len - длина поля string , без нулевого символа.
Цитата

... обработка

Тут делаем с a.string что надо (но учесть что она без '\0')
Цитата

а после отправки надо делать 
Цитата

delete [] a.string;


Да , надо.

Объясню поподробней.
В гибком варианте идет расчет  , что при получении пакета мы сначала считаем len, len - длина поля string , без нулевого символа.
А потом считываем len байтов , в итоге получим все  ,что было отправлено.
То что я написал - просто для наглядности и понятия что надо делать. Приблизительный код будет таким , но тк я не тестировал возможны ошибки.
Просто надо понять что структура пакета:
len                     char
4 байта             len*char байтов
Поле len вноситься чтобы сервер знал , какой длины сообщение string.
При этом клиент должен соответственно заполнять поле len длиной string

Сам до конца не понял , но наверное надо использовать для структур правильное выравнивание , иначе возможны ошибки:
Код

#pragma pack(push, 1)

struct { /* ... */ };

#pragma pack(pop)



Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 15:06


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


Бывалый
*


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

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



В том и загвоздка , что вопрос я упростил вопрос.
len у меня в задаче хранит всю длинну сообщения включая
несколько полей uint  и string
PM MAIL ICQ   Вверх
REZiaMIX
Дата 17.11.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @ 17.11.2008,  15:57)
В том и загвоздка , что вопрос я упростил вопрос.
len у меня в задаче хранит всю длинну сообщения включая
несколько полей uint  и string

А зачем хранить длину полей фиксированной длины?
Код

struct packet
{
uint len;
char * string
uint val1;
uint val2;
}a;


Здесь мы должны знать len, чтобы считать string, а:
адрес val1 = sizeof(len)+ len;
val2 = sizeof(len)+ len + sizeof(val1);

Простая арифметика)

Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 16:07


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


Бывалый
*


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

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



Цитата

a.len = strlen(string);

а разве len это не длинна поле string?
мы ведь нигде не добавляем к длинне сообщения ещё и размер самого поля uint

Добавлено через 2 минуты и 58 секунд
А если структуру преобразоватьв vector это не упростит задачу?

Добавлено через 11 минут и 19 секунд
С адресами я понял, а как из буфера (char*)&a
прочитать значение для первого поля структуры? 

PM MAIL ICQ   Вверх
REZiaMIX
Дата 17.11.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @ 17.11.2008,  16:09)
Цитата

a.len = strlen(string);

а разве len это не длинна поле string?
мы ведь нигде не добавляем к длинне сообщения ещё и размер самого поля uint

Добавлено @ 16:12
А если структуру преобразоватьв vector это не упростит задачу?

Добавлено @ 16:20
С адресами я понял, а как из буфера (char*)&a
прочитать значение для первого поля структуры?

len - длина поля string , уже писал.
передавать vector думаю не лучшая идея smile
a - обычная структура , с ней и работать надо как со структурой)

Код

struct packet
{
uint len;
char * string
uint val1;
uint val2;
}a;

Код

a.packet
a.string
a.val1
a.val2



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


Бывалый
*


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

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



то есть при приёме
Код

recv(socket,(char*)&a,len,sizeof(a.len),NULL);
 
структура будет заполнена автоматически?
PM MAIL ICQ   Вверх
REZiaMIX
Дата 17.11.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @ 17.11.2008,  17:11)
то есть при приёме
Код

recv(socket,(char*)&a,len,sizeof(a.len),NULL);
 
структура будет заполнена автоматически?

Все поля , которые имеют неопределенный размер(в нашем случае string) надо както отдельно обрабатывать.
Опечатка , там точка:
Код

recv(socket,(char*)&a.len,sizeof(a.len),NULL);
 
Тут мы получим размер поля , для последующего считывания string.
далее считаем string
Код

recv(socket,(char*)&a.string,a.len,NULL);

Если в структуре все поля имеют фикс. размер , то:
Код

recv(socket,(char*)&a,sizeof(a),NULL);

Автоматически заполнит всю структуру.




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


Бывалый
*


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

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



Чё -то сообщение пустое
PM MAIL ICQ   Вверх
REZiaMIX
Дата 18.11.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @ 18.11.2008,  15:47)
Чё -то сообщение пустое

Чье?


--------------------
user posted image
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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