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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как по TCP/IP передать структуру, посоветуйте 
V
    Опции темы
xrays777
Дата 27.7.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



к примеру, есть структура:

struct event 
{
  int             desc;           
  uint32_t    mask;  
  uint32_t    time; 
  uint32_t    len;    
  char          name[256];    
}


вопросы:

1) каким способом ее можно передать по TCP?
    я пока остановился на следующем способе: последовательно передавать все поля структуры

2) какое максимальное значение имени файла в Unix (по-моему, 256)? поправьте, если ошибаюсь

спасибо всем, кто уделил время
PM MAIL   Вверх
GoldFinch
Дата 27.7.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Код

event e;
..
send(..., &e, sizeof(e), ...);

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


Новичок



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

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



спасибо, т.е. так прокатит?!
а как быть, если массив чаровский нестатический, а содержит указатель на строку, а эта строка может быть различной, а требуется передать как бы саму структуру + строку, на которую указывает указатель, а сам бы указатель не нужно было передавать, т.е.

char* str="Hello, world";

struct event 
{
  int             desc;           
  uint32_t    mask;  
  uint32_t    time; 
  uint32_t    len;    // длинна строки на которую указывает name
  char*        name;  // указатель на строку  
}

event e;
e.name=str;
e.len=длинна этой строки


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


Кодофей
****


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

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



xrays777, передавай строку, ее длину. а на втором конце собирай.

Это сообщение отредактировал(а) andrew_121 - 27.7.2009, 22:26


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
vinick
Дата 27.7.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xrays777 @  27.7.2009,  22:03 Найти цитируемый пост)
event e;
e.name=str;
e.len=длинна этой строки

Ни в коем случае!!!

Если хочешь передавать структуру целиком, то 
Код

har* str="Hello, world";

struct event 
{
  int             desc;           
  uint32_t    mask;  
  uint32_t    time; 
  uint32_t    len;
  char       name[PATH_MAX];  // указатель на строку  
};
//...
strncpy(e.name,str,PATH_MAX);
e.name[PATH_MAX] = '\0'; 
e.len = strlen(e.name);


PATH_MAX у меня определяется как 4096. Это вроде как максимальный полный путь с завершающим нулем.
PM MAIL ICQ Jabber   Вверх
andrew_121
Дата 27.7.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(vinick @  27.7.2009,  22:26 Найти цитируемый пост)
Ни в коем случае!!!

Это почему же?
Цитата(andrew_121 @  27.7.2009,  22:25 Найти цитируемый пост)
передавай строку, ее длину. а на втором конце собирай.


Добавлено через 2 минуты и 56 секунд
либо сериализуй структуру.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
vinick
Дата 27.7.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(andrew_121 @  27.7.2009,  22:27 Найти цитируемый пост)

Это почему же?

 Это у меня проблемы с чтением  smile  Решил, что 
xrays777,  собрался структуру с указателем передавать через send(..., &e, sizeof(e), ...);

А так действительно, либо 
Цитата(andrew_121 @  27.7.2009,  22:25 Найти цитируемый пост)
xrays777, передавай строку, ее длину. а на втором конце собирай.

либо
Цитата(andrew_121 @  27.7.2009,  22:27 Найти цитируемый пост)
либо сериализуй структуру.


PM MAIL ICQ Jabber   Вверх
GoldFinch
Дата 27.7.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



*сериализуй - значит юзай boost.serialization
PM MAIL ICQ   Вверх
azesmcar
Дата 28.7.2009, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Про выравнивание структур не забыли?
Код

#pragma pack(push)
#pragma pack(1)

struct event 
{
    int             desc;           
    uint32_t    mask;  
    uint32_t    time; 
    uint32_t    len;
    char       name[PATH_MAX];  // указатель на строку  
};

#pragma pack(pop)


PM   Вверх
GoldFinch
Дата 28.7.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



azesmcar, а при чем тут твое выравнивание, если код на обоих сторонах компилит 1 компилятор?
и почему выравнивание 1?
PM MAIL ICQ   Вверх
azesmcar
Дата 28.7.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(GoldFinch @  28.7.2009,  08:48 Найти цитируемый пост)
код на обоих сторонах компилит 1 компилятор?

1. Об этом нигде не сказано (хотя в этом (да и не только в этом) случае могут возникнуть и другие проблемы, но их можно решить по ходу).
2. Настройки в обоих проектах те же самые?
3. Зачем посылать 4 или 8 байт вместо 1-го?
Код

#include <iostream>
struct event1
{
    char a;
    int b;
    short c;
    char d;
};

#pragma pack(push)
#pragma pack(1)

struct event2 
{
    char a;
    int b;
    short c;
    char d;
};

#pragma pack(pop)

int main()
{
    std::cout << sizeof(event2) << std::endl;
    std::cout << sizeof(event1) << std::endl;
}

сравни размеры.

Это сообщение отредактировал(а) azesmcar - 28.7.2009, 08:56
PM   Вверх
GoldFinch
Дата 28.7.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



azesmcar, в большинстве ситуаций, выравнивание значимо больше трафика не сделает.
хотя и прироста быстродействия никакого не даст.
зато лишние строчки кода есть.
PM MAIL ICQ   Вверх
xrays777
Дата 28.7.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ребята, всем преогромное спасибо за помощь, решил передавать структуру(кроме указателя на строку) и отдельно саму строку

спасибо еще раз всем
PM MAIL   Вверх
azesmcar
Дата 28.7.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(GoldFinch @  28.7.2009,  10:04 Найти цитируемый пост)
azesmcar, в большинстве ситуаций, выравнивание значимо больше трафика не сделает.
хотя и прироста быстродействия никакого не даст.
зато лишние строчки кода есть. 

Я назвал 3 причины, и потребление траффика лишь одна из них. Да, если программа за всю сознательную жизнь посылает одну структуру размером в 3 байта - может и не даст, попробуй сгруппировать структуры при отсылке в один пакет, попробуй сделать структуру побольше. И почему тебя так сильно волнуют лишние строки кода? smile 
Хранишь место на диске? Байт - гигабайт бережет.

Это сообщение отредактировал(а) azesmcar - 28.7.2009, 10:11
PM   Вверх
GoldFinch
Дата 28.7.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



azesmcar, много кода - сложнее читать
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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