0207作业
思维导图
服务器
enum Type{
TYPE_REGIST,
TYPE_LOGIN
};
typedef struct Pack{
int size;
enum Type type;
char buf[2048];
}pack_t;
typedef struct list{
union Data{
struct List* tail;
char str[64];
}data;
struct List* next;
struct List* prev;
}List;
List* create_node(){
List* H=malloc(sizeof(List));
H->next=NULL;
H->prev=NULL;
H->data.tail=H;
return H;
}
void insert(List* head,List* p){
head->data.tail->next=p;
p->next=head;
p->prev=head->data.tail;
p->data.tail=p;
}
void read_pack(pack_t* pack){
List* head=create_node();
int readed_size = 0;
while(1)
{
short data_size = *(short*)(pack->buf+readed_size);
if(data_size == 0)
{
printf("数据解析完毕\n");
break;
}
readed_size += 2;
List* p=calloc(1,sizeof(List));
memcpy(p->data.str,pack->buf+readed_size,data_size);
readed_size +=data_size;
insert(head,p);
}
}
int main(int argc, const char *argv[])
{
int server=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr ={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.s_addr=inet_addr("0.0.0.0");
if(bind(server,(addr_t*)&addr,sizeof(addr))==-1){
perror("bind");
return 1;
}
listen(server,10);
addr_in_t client_addr={0};
int client_addr_len=sizeof(client_addr);
int client=accept(server,(struct sockaddr*)&client_addr,&client_addr_len);
while(1){
pack_t pack={0};
int pack_size=0;
read(client,&pack_size,4);
read(client,(char*)&pack+4,pack_size-4);
pack.size=pack_size;
read_pack(&pack);
}
return 0;
}