URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2244
[ Назад ]

Исходное сообщение
"вопрос по сокетам"

Отправлено Gorynych , 04-Ноя-03 16:10 

блина, торможу я - помогите найти где лажанулся...
--------------------------------
две структурки в хедере
struct MYDATA {
long size
void* data;
};

struct MYPACK{
long size;
int some_fields;
struct MYDATA content;
};

--------------------------------
теперь клиентская сторона
struct MYPACK *my_pack_p = (struct MYPACK*)malloc(sizeof(struct MYPACK));

my_pack_p->content.size = strlen("vasa");
my_pack_p->content.data = malloc(my_pack_p->content.size);
strncpy((char*)my_pack_p->content.data, "vasa", my_pack_p->content.size);
/*остальные поля инициализируем тоже*/
my_pack_p->size = sizeof(*my_pack_p) + my_pack_p->content.size;
/*т.е. размер структуры плюс размер данных*/


потом пара десятков строк открытие сокета
sd = socket(AF_INET,SOCK_DGRAM,0);

и если все хорошо, то шлю my_pack_p на сервер
rc = sendto(sd, msg, msg->size, 0,
               (struct sockaddr *) &remoteServAddr, sizeof(remoteServAddr));


все уходит "на ура"

--------------------------------
теперь серверная сторона

n = recvfrom(sd, msg, 65000, 0, (struct sockaddr *) &cliAddr, &cliLen);
получаю мой пак в msg. n - равен msg->size (т.е. тому размеру, который
я и послал). ВСЕ поля структуры получили те значения, которые я определил
у клиента, ЗА ИСКЛЮЧЕНИЕМ СТРОКИ!!!
строка всегда пустая. msg->content.size равен длине посланной строки
а (char*)msg->content.data всегда пуста........

блина. и что я напортачил????


Содержание

Сообщения в этом обсуждении
"вопрос по сокетам"
Отправлено vvv , 04-Ноя-03 16:30 
>
>блина, торможу я - помогите найти где лажанулся...
>--------------------------------
>две структурки в хедере
>struct MYDATA {
>long size
>void* data;
>};

на первый взгляд
вроде как надо не void* data а char data[MAX_LEN] ну а MAX_LEN сам задай.


"вопрос по сокетам"
Отправлено Gorynych , 04-Ноя-03 18:57 
>>
>>блина, торможу я - помогите найти где лажанулся...
>>--------------------------------
>>две структурки в хедере
>>struct MYDATA {
>>long size
>>void* data;
>>};
>
>на первый взгляд
>вроде как надо не void* data а char data[MAX_LEN] ну а MAX_LEN
>сам задай.


все. разобрался.
надо так
struct BLA{
int field;
int len;
char data[0];
};
и аллокировать переменную с размером = размер структуры + размер данных.при это надо помнить что data всегда в конце!

всем спасибо