Exemple #1
0
/*根据放映厅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;
}
Exemple #2
0
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);
                    }
                }
            }
        }
    }
}