Мне удалось отправить c struct поверх сокета.Я создаю временную структуру c и отправляю ее через сокет?
Но я читал, что есть два способа сделать это:
путем динамического распределения памяти и заполнение элементов структуры затем возвращает указатель на структуру
Создать временный структурировать и заполнить элементы структуры, а затем вернуть содержимое структуры.
Мой код здесь:
Я имею эту структуру:
typedef struct EnQuery {
char type[7];
char table_name[53];
char columns[5][53];
struct Values {
char doc[129];
char key[2][206];
char iv[17];
char td[53];
char s[206];
}values;
struct EnCondition {
int k;
char attr[53];
char val[53];
}enCondition;
int len;
int rn;
}EnQuery;
и он объявлен в основной():
struct EnQuery * ieq;
ieq = (EnQuery *)malloc(sizeof(EnQuery));
strcpy(ieq->type,"INSERT");
strcpy(ieq->table_name,"table_name");
strcpy(ieq->columns[0],"Hello");
strcpy(ieq->columns[1],"hi");
strcpy(ieq->columns[2],"an");
strcpy(ieq->columns[3],"nyung");
strcpy(ieq->columns[4],"haseyo");
strcpy(ieq->values.doc,"doc");
strcpy(ieq->values.key[0],"key1");
strcpy(ieq->values.key[1],"key2");
strcpy(ieq->values.iv,"iv");
strcpy(ieq->values.td,"td");
strcpy(ieq->values.s,"s");
ieq->enCondition.k = htonl(1);
strcpy(ieq->enCondition.attr,"attr");
strcpy(ieq->enCondition.val,"val");
ieq->len = htons(1);
ieq->rn = htons(2);
и использует эту функцию послать:
send_struct(&sfd,ieq);
Содержание send_struct():
send_struct(int * sfd, struct EnQuery *ieq) {
int n;
char buff[256];
if(n = read(*sfd,buff,256) > 0) {
struct EnQuery eq;
eq = *ieq;
printf("eq.type = %s\n",eq.type);
printf("eq.table_name = %s\n",eq.table_name);
printf("eq.columns = {%s,%s,%s,%s,%s}\n",eq.columns[0],eq.columns[1],eq.columns[2],eq.columns[3],eq.columns[4]);
printf("eq.values.doc = %s\n",eq.values.doc);
printf("eq.values.key = {%s,%s}\n",eq.values.key[0],eq.values.key[1]);
printf("eq.values.iv = %s\n",eq.values.iv);
printf("eq.values.td = %s\n",eq.values.td);
printf("eq.values.s = %s\n",eq.values.s);
printf("eq.enCondition.k = %d\n",ntohs(eq.enCondition.k));
printf("eq.enCondition.attr = %s\n",eq.enCondition.attr);
printf("eq.enCondition.val = %s\n",eq.enCondition.val);
printf("eq.len = %d\n",ntohs(eq.len));
printf("eq.rn = %d\n",ntohs(eq.rn));
send(*sfd,&eq,sizeof(struct EnQuery),0);
}
}
На приемной стороне:
recv_struct(int sfd){
struct EnQuery eq;
FILE* instream = fdopen(sfd,"r");
if(fread(&eq,sizeof(struct EnQuery),1,instream) != 1) {
error("fread(1)");
}
printf("eq.type = %s\n",eq.type);
printf("eq.table_name = %s\n",eq.table_name);
printf("eq.columns = {%s,%s,%s,%s,%s}\n",eq.columns[0],eq.columns[1],eq.columns[2],eq.columns[3],eq.columns[4]);
printf("eq.values.doc = %s\n",eq.values.doc);
printf("eq.values.key = {%s,%s}\n",eq.values.key[0],eq.values.key[1]);
printf("eq.values.iv = %s\n",eq.values.iv);
printf("eq.values.td = %s\n",eq.values.td);
printf("eq.values.s = %s\n",eq.values.s);
eq.enCondition.k = ntohs(eq.enCondition.k);
printf("eq.enCondition.k = %d\n",eq.enCondition.k);
printf("eq.enCondition.attr = %s\n",eq.enCondition.attr);
printf("eq.enCondition.val = %s\n",eq.enCondition.val);
eq.len = ntohs(eq.len);
printf("eq.len = %d\n",eq.len);
eq.rn = ntohs(eq.rn);
printf("eq.rn = %d\n",eq.rn);
}
Поскольку я реализует методом проб и ошибок, я не уверен, какой именно я здесь делаю ,
Какой из них является моим кодом в соответствии с? отправляется ли он как связанный двоичный формат?
Может кто-нибудь уточнить, что происходит с моим кодом?