/*根据放映厅ID提取有效的座位*/ int Seat_Srv_FetchValidByRoomID(seat_list_t list, int roomID) { //根据演出厅ID载入座位 int SeatCount=Seat_Perst_SelectByRoomID(list, roomID); seat_node_t *p; //去除无效座位 List_ForEach(list, p){ if(p->data.status!=SEAT_GOOD){ List_FreeNode(p); SeatCount--; } } //对座位链表排序 Seat_Srv_SortSeatList(list); return SeatCount; }
int main() { int sock_fd; int conn_fd; int optval; int srv_len,clt_len; int ret; int flag=0; int flag_recv=0; int switch_num; List_Init(head,online_node_t); online_node_t *p; pid_t pid; struct sockaddr_in srv_sock,clt_sock; char recv_buf[BUFSIZE]; fd_set readfds,testfds; //创建一个TCP 套接字 sock_fd=socket(AF_INET,SOCK_STREAM,0); if(sock_fd<0) { perror("socket"); } //设置该套接字使之可以重新绑定 optval=1; if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(int))<0) { perror("setsockopt"); } //初始化本地端 memset(&srv_sock,0,sizeof(struct sockaddr_in )); srv_sock.sin_family=AF_INET; srv_sock.sin_port=htons(SERV_PORT); srv_sock.sin_addr.s_addr=htonl(INADDR_ANY); //绑定套接字到本地端 if(bind(sock_fd,(struct sockaddr *)&srv_sock,sizeof(struct sockaddr_in ))<0) { perror("bind"); } //设置监听 if(listen(sock_fd,MAX_LIST)<0) { perror("listen"); } p=(online_node_t *)malloc(sizeof(online_node_t)); p->sock_fd=sock_fd; srv_len=sizeof(struct sockaddr_in); List_AddHead(head,p); fd_count++; FD_ZERO(&readfds); FD_SET(sock_fd,&readfds); while(1) { int fd; int nread; int j; online_node_t *s; s=head; testfds=readfds; printf("service waiting\n"); ret=select(MAX_LIST, &testfds ,(fd_set *)0,(fd_set *)0,(struct timeval *)0); if(ret<0) { perror("select"); } for(fd=0;fd<fd_count;fd++) { if(flag!=1) s=s->next; flag=0; if(FD_ISSET(s->sock_fd,&testfds)) { if(s->sock_fd==sock_fd) { clt_len=sizeof(struct sockaddr_in); conn_fd=accept(sock_fd,(struct sockaddr *)&clt_sock,&clt_len); FD_SET(conn_fd,&readfds); p=(online_node_t*)malloc(sizeof(online_node_t)); p->sock_fd=conn_fd; List_AddHead(head,p); fd_count++; printf("adding client on fd %d\n",p->sock_fd); } else { memset(recv_buf,0,sizeof(recv_buf)); nread = recv(s->sock_fd,recv_buf,sizeof(recv_buf),0); if(nread==0) { online_node_t *h; h=s; s=s->next; flag=1; FD_CLR(h->sock_fd,&readfds); close(h->sock_fd); printf("removeing clinet on fd %d\n",h->sock_fd); List_FreeNode(h); fd_count--; } else { if((pid=fork())==0) { online_node_t *r; r=head->next; printf("Tets fd_count=%d\n",fd_count); for(j=0;j<fd_count;j++) { if (r->sock_fd == head->prev->sock_fd) continue; if(send(r->sock_fd,recv_buf,sizeof(recv_buf),0)<0) { perror("send"); } r=r->next; } exit(0); } //printf("recv = %s",recv_buf); } } } } } }