2015-10-31 2 views
0

Мне удалось отправить c struct поверх сокета.Я создаю временную структуру c и отправляю ее через сокет?

Но я читал, что есть два способа сделать это:

  1. путем динамического распределения памяти и заполнение элементов структуры затем возвращает указатель на структуру

  2. Создать временный структурировать и заполнить элементы структуры, а затем вернуть содержимое структуры.

Мой код здесь:

Я имею эту структуру:

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); 
} 

Поскольку я реализует методом проб и ошибок, я не уверен, какой именно я здесь делаю ,

Какой из них является моим кодом в соответствии с? отправляется ли он как связанный двоичный формат?

Может кто-нибудь уточнить, что происходит с моим кодом?

ответ

0

Динамическое выделение указателя структуры не требуется (как выполняется перед send_struct()).
Временная структура также будет работать нормально. (send_struct (& sfd, & obj) где struct EnQuery obj;)

Передача данных сокета - это в основном массив байтов.
Если вы видите хранилище своей структуры в памяти, это также массив байтов в памяти.

Следовательно, динамически выделяющий или временный экземпляр будет отличаться только в области памяти, где хранятся ваши данные структуры (куча в первом случае, стек во втором случае).

Смежные вопросы