【问题标题】:Am I creating a temporary c struct and sending it through socket?我是在创建一个临时的 c 结构并通过套接字发送它吗?
【发布时间】:2016-01-31 12:44:11
【问题描述】:

我已经设法通过套接字发送 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;

并在main()中声明:

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

由于我一直在反复试验, 我不确定我在这里做什么。

我的代码根据上面哪一个?它是以链接二进制格式发送的吗?

谁能详细说明我的代码发生了什么?

【问题讨论】:

    标签: c sockets pointers struct syntax


    【解决方案1】:

    不需要动态分配结构指针(就像在 send_struct() 之前所做的那样)。
    临时结构也可以正常工作。 (send_struct(&sfd, &obj) where struct EnQuery obj;)

    套接字数据通信基本上是字节数组。
    如果你看到你的结构存储在内存中,它也是内存中的字节数组。

    因此,动态分配或临时实例只会在存储结构数据的内存区域中有所不同(第一种情况是堆,第二种情况是堆栈)。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2011-06-18
      • 2015-01-02
      • 2013-07-22
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多