Хотя это может быть дубликат сообщения, я хотел бы убедиться, как он работает в моем конкретном коде.C: Отправить вложенную структуру через TCP-сокет
Чего я хочу достичь?
Отправка и получение структуры по TCP/IP-соединению.
Что у меня есть?
Sender
инициализации структур:
typedef struct soutputdata {
unsigned long long ull_date;
unsigned int ui_ixl;
unsigned int ui_type;
unsigned int ui_index;
char c_values[64][2];
int i_valueid;
} s_OUTPUTDATA;
typedef struct sheader {
int i_head;
} s_HEADER;
typedef struct soutdata {
s_HEADER *sHeader;
s_OUTPUTDATA *sDATAout;
} s_OUTDATA;
Теперь я хочу, чтобы отправить s_OUTDATA-структуру для подключенного клиента TCP.
выделения памяти (это правильно?):
s_OUTDATA *poutData = malloc(sizeof(s_OUTDATA));
poutData->sDATAout = malloc(sizeof(s_OUTPUTDATA));
poutData->sHeader = malloc(sizeof(s_HEADER));
Отправка-структуру (, как я могу получить правильный размер всего s_OUTDATA структуры?):
if ((send(sendSocket, poutData, 1024, 0)) == -1) {
fprintf(errlog, "%.3f error: %s(): Failure Sending Message!\n", gettime(), __func__);
close(sendSocket);
}
Получатель
инициализации структур:
typedef struct soutputdata {
unsigned long long ull_date;
unsigned int ui_ixl;
unsigned int ui_type;
unsigned int ui_index;
char c_values[64][2];
int i_valueid;
} s_OUTPUTDATA;
typedef struct sheader {
int i_head;
} s_HEADER;
typedef struct soutdata {
s_HEADER *sHeader;
s_OUTPUTDATA *sDATAout;
} s_OUTDATA;
выделения памяти (это правильно?):
s_OUTDATA *p = malloc(sizeof(s_OUTDATA));
poutData->sDATAout = malloc(sizeof(s_OUTPUTDATA));
poutData->sHeader = malloc(sizeof(s_HEADER));
получающего-структуру:
if ((num = recv(newSocket, p, 1024,0)) == -1) {
perror("recv");
exit(1);
}
else if (num == 0) {
printf("Connection closed\n");
}
Что такое проблема?
При попытке работать с полученными данными я получаю ошибку в сегментации.
printf("ui_index: %d\n", p->sDATAout->ui_index);
Что мне не хватает?
Я предполагаю, что я сделал неправильный с распределением памяти, но я не уверен, что и как его решить.
спасибо за быстрый ответ. Ничего себе, это полностью упустило. но теперь я получаю компиляционную ошибку при работе с указателем обеих структур (потому что они больше не существуют). Нужно ли менять все на экземпляры? – Frechdachs
@Frechdachs Да, поскольку типы данных членов изменились, вам необходимо обратиться к их использованию. То есть 'p-> sHeader.i_head' вместо' p-> sHeader-> i_head'. – dbush
ОК, черт возьми. потому что я имею, например, функцию с указателем на структуру s_OUTPUTDATA в качестве возврата, и теперь мне нужно вернуть всю структуру, которая просто слишком тяжелая. или я могу передать содержимое указателя в экземпляр? – Frechdachs