思维导图
服务器
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;
}