怎么显示枚举类型呢?请求帮助,谢谢!
这是我的server端的程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define server_port 5000
#define client_port 6000
#define MAXSIZE 1000
int main(void)
{
int sockfd;
char sendbuf[MAXSIZE];
char recvbuf[MAXSIZE];
int so_broadcast = 1;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
typedef enum sex{F,M} gender; /*F is man,M is girl*/
struct date
{
int day;
int month;
int year;
};
struct student
{
char name[20];
gender xb;
//char sex;
struct date birthday;
int age;
};
struct student stu;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("error in socket\n");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr.s_addr = inet_addr("172.18.190.24");
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(client_port);
client_addr.sin_addr.s_addr = inet_addr("172.18.190.24");
int result = 0;
result = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&so_broadcast, sizeof(so_broadcast));
if(result < 0)
{
printf("error with setsockopt()\n");
exit(1);
}
result = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(result < 0)
{
printf("error bind:result = %d\n", result);
exit(1);
}
while(1)
{
// struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int rev = recvfrom(sockfd, recvbuf, MAXSIZE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
if(rev <= 0)
{
printf("error recvfrom: rev = %d\n",rev);
exit(1);
}
else
{
recvbuf[rev] = '\0';
puts(recvbuf);
}
int cmp;
char com[] = {"exit\n"};
cmp = (strcmp(recvbuf, com) );
//printf("%d\n", cmp);
// printf("%d\n", strlen(recvbuf));
if(cmp == 0) break;
//struct sockaddr_in your_addr;
//socklen_t your_addr_len = sizeof(your_addr);
scanf("%s,%c,%d%d%d,%d", &stu.name, &stu.xb, &stu.birthday.day, &stu.birthday.month, &stu.birthday.year, &stu.age);
//fgets(sendbuf, sizeof(sendbuf), stdin);
strcpy(sendbuf, (char *)&stu);
int nSend =sendto(sockfd, (const char *)&sendbuf, strlen(sendbuf), 0, (struct sockaddr*)&client_addr, client_addr_len);
if (nSend <= 0)
{
printf("sendto() error: %d\n", nSend);
exit(1);
}
}
close(sockfd);
return 0;
}
这是我client端的程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define server_port 5000
#define client_port 6000
#define MAXSIZE 1000
int main(void)
{
int sockfd;
char sendbuf[MAXSIZE];
char recvbuf[MAXSIZE];
int so_broadcast = 1;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
typedef enum sex{F,M} gender; /*F is man,M is girl*/
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[20];
gender xb;
// char sex; /*F is man,M is girl*/
struct date birthday;
int age;
};
struct student stu;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("error in socket\n");
exit(1);
}
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(client_port);
client_addr.sin_addr.s_addr = inet_addr("172.18.190.24");
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr.s_addr = inet_addr("172.18.190.24");
int result = 0;
result = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&so_broadcast, sizeof(so_broadcast));
if(result < 0)
{
printf("error with setsockopt()\n");
exit(1);
}
result = bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr));
if(result < 0)
{
printf("error bind:result = %d\n", result);
exit(1);
}
while(1)
{
fgets(sendbuf, sizeof(sendbuf), stdin);
//struct sockaddr_in server_addr;
//socklen_t client_addr_len = sizeof(server_addr);
int nSend =sendto(sockfd, (const char *)&sendbuf, strlen(sendbuf), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (nSend <= 0)
{
printf("sendto() error: %d\n", nSend);
exit(1);
}
int cmp;
char com[] = {"exit\n"};
cmp = (strcmp(sendbuf, com) );
// printf("%d\n", cmp);
//printf("%d\n", strlen(sendbuf));
if(cmp == 0) break;
struct sockaddr_in who;
socklen_t who_len = sizeof(who);
int rev = recvfrom(sockfd, recvbuf, MAXSIZE, 0, (struct sockaddr*)&who, &who_len);
if(rev <= 0)
{
printf("error recvfrom: rev = %d\n",rev);
exit(1);
}
else
{ int m,w;
switch(recvbuf.xb)
{
case 0:
printf("%c",recvbuf.xb == m); break;
case 1:
printf("%c",recvbuf.xb == w); break;
default: break;
}
/*if(recvbuf.xb == 0)*/
printf("%s%c%d%d%d%d", stu.name, stu.xb, stu.birthday.day, stu.birthday.month, stu.birthday.year, stu.age);
/* else(recvbuf.xb == 1)
{
printf("%s,%d is woman,%d-%d-%d,%d", stu.name, stu.xb, stu.birthday.day, stu.birthday.month, stu.birthday.year, stu.age);
}*/
//recvbuf[rev] = '\0';
// puts(recvbuf);
}
}
close(sockfd);
return 0;
}
[解决办法]
1、枚举输入输出的时候以整型来描述;
2、recvbuf.xb是不对的,因为recvbuf只是一个char数组,没有域的概念,不能用.只能用[]来取值。
[解决办法]
如果你想用字符型表示性别就不用定义枚举类型了
typedef char gender;
[解决办法]
//recvfrom(sockfd, recvbuf, MAXSIZE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
recvfrom(sockfd, (char*)&stu, MAXSIZE, 0, (struct sockaddr*)&client_addr, &client_addr_len);