我有这个结构:
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
传输其他内容时,例如int
或char[]
,它可以完美地运行。我尝试连接一个客户端,所以它不是错误的客户端。请注意,结构是在客户端和在一台计算机上运行的服务器之间发送的。
有什么想法吗?