Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как по TCP/IP передать структуру


Автор: xrays777 27.7.2009, 21:34
к примеру, есть структура:

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


вопросы:

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

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

спасибо всем, кто уделил время

Автор: GoldFinch 27.7.2009, 21:54
Код

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

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

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=длинна этой строки


Автор: andrew_121 27.7.2009, 22:25
xrays777, передавай строку, ее длину. а на втором конце собирай.

Автор: vinick 27.7.2009, 22:26
Цитата(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. Это вроде как максимальный полный путь с завершающим нулем.

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

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


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

Автор: vinick 27.7.2009, 22:41
Цитата(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 Найти цитируемый пост)
либо сериализуй структуру.


Автор: GoldFinch 27.7.2009, 23:21
*сериализуй - значит юзай boost.serialization

Автор: azesmcar 28.7.2009, 08:24
Про выравнивание структур не забыли?
Код

#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)


Автор: GoldFinch 28.7.2009, 08:48
azesmcar, а при чем тут твое выравнивание, если код на обоих сторонах компилит 1 компилятор?
и почему выравнивание 1?

Автор: azesmcar 28.7.2009, 08:53
Цитата(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;
}

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

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

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

спасибо еще раз всем

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

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

Автор: GoldFinch 28.7.2009, 13:42
azesmcar, много кода - сложнее читать

Автор: azesmcar 28.7.2009, 14:01
Цитата(GoldFinch @  28.7.2009,  13:42 Найти цитируемый пост)
azesmcar, много кода - сложнее читать 

абсолютно не согласен. Эти два фактора никак не связаны. В некоторых ситуациях даже наоборот, если пытаться сократить программу, код становиться нечитабельным.

Автор: xrays777 28.7.2009, 15:28
всем спасибо, тему закрываю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)