嵌套结构的内容在通过套接字时被清空

时间:2014-05-10 16:16:37

标签: c sockets structure unions

我有这个结构:

enum msg_type {CONN, CRESP, INT, STRING};
typedef struct gen_msg {
    enum msg_type type;
    union {
        connection conn;
        connection_response cresp;
        int i;
        char s[256];
    };
} gen_msg;

connection结构定义如下:

typedef struct connection {
    char name[BUFLEN];
} connection;

我知道我可以通过一个简单的union替换char[]中的结构,但由于我在连接时发送的信息有一天可能包含的内容不仅仅是名称,我更喜欢保留它结构。

第一个结构gen_msg用于通过套接字在客户端和服务器之间传递消息。在我的客户中,我有这个:

printf("Please enter your name: ");

if (fgets(ibuf, BUFLEN, stdin) != NULL) {
    ibuf[strlen(ibuf) - 1] = '\0';

    gen_msg msg;
    msg.type = CONN;
    strcpy(msg.conn.name, ibuf);
    printf("Name to be sent: %s", msg.conn.name);
    write(server, &msg, sizeof(msg));
}

printf正确打印名称。现在,在服务器端,我这样做:

gen_msg receive_msg(int client) {
    int nbytes;
    gen_msg msg;

    if ((nbytes = recv(client, &msg, sizeof(msg), 0)) <= 0) {
        if (nbytes == 0) {
            /* Server connection closed */
            fprintf(stderr, "The client closed the connection\n");
            close(client);
            FD_CLR(client, &master_fdset);
        } else {
            perror("error - recv");
            exit(1);
        }
    }

    return msg;
}

int main() {
    /* Other stuff to initialize the server, handle the clients, etc. */

    while(1) {
        gen_msg msg = receive_msg(client);

        /* Do some checks and storage */
        /* The following just copies the players' name inside a structure     that contains information regarding the connected players */
        strcpy(g_info.players_tab[g_info.num_players].name, msg.conn.name);

        fprintf(stderr, "Accepted player %s\n", msg.conn.name);

        /* More other stuff */    
    }


}

这会打印Accepted player,因此它无法获取名称。但是,当我使用gen_msg传输其他内容时,例如intchar[],它可以完美地运行。我尝试连接一个客户端,所以它不是错误的客户端。请注意,结构是在客户端和在一台计算机上运行的服务器之间发送的。

有什么想法吗?

0 个答案:

没有答案