LINUX.ORG.RU

вопрос по сокетам


0

0

блина, торможу я - помогите найти где лажанулся...
--------------------------------
две структурки в хедере
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 всегда пуста........

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

anonymous

:)) аля передача поинтеров в rpc?

обычно делают так:

struct MYPACK{
long size;
int some_fields;
/* struct MYDATA content; */
int len;
char data[0];
};

mypack = (...)(malloc(sizeof(struct MYPACK) + datasize));
...
...
send(sock, mypack, ...)

lg ★★
()
Ответ на: комментарий от lg

спасибо
свои грабли я понял
но предложенное решение - не понял :(
struct
{
// blabla
char data[0];
}
получается, что это принципиально важно, чтоб data была в конце структуры

а если это не char а какой-нить двоичный объект?? надо пользовать stream socket??

anonymous
()
Ответ на: комментарий от anonymous

RE:

> получается, что это принципиально важно, чтоб data была в конце структуры

Именно. Член переменной длины в структуре перекрывает стоящие после него члены.

>а если это не char а какой-нить двоичный объект?? надо пользовать stream socket??

А двоичный объект нельзя хранить в char[]? Если бы это была структура фиксированного (заранее известного) размера, то и данный приём не понадобился бы. Кстати, если передача лишних данных не критична, и известен максимальный размер передаваемой строки (и он не очень большой) можно задать поле, как char[MAX_SIZE+1], хотя предыдущее решение более правильное.

loki
()
Ответ на: RE: от loki

спасибо за все ответы.
все заработало.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.