Example #1
0
int main(int argc,char* argv[])
{
	if(argc != 3 )
	{
		usage(argv[0]);
		exit(1);
	}


	int port = atoi(argv[2]);
	int listen_sock = start(argv[1],port);

	if(listen_sock < 0)
		exit(2);

	select_fd_t select_set;
	init_select_set(&select_set,listen_sock);
	fd_set r_set;//read file fd set

	while(1)
	{
		FD_ZERO(&r_set);
		add_read_fd(&r_set,&select_set); //将参数2 的值添加到参数1中
		struct timeval timeout ={3,500};//fei zuse
		 switch (select(select_set.max_fd+1,&r_set,NULL,NULL,&timeout) )
		 {
			case 0:
				perror("timeout");
				break;
			case -1:
				perror("select");
				break;
			default://success
				{ 
					int i = 0;
					for(;i<_FD_NUM_;++i)
					{
						int fd = select_set.fd_arr[i];
						if(0==i && FD_ISSET(fd,&r_set) )//new connect
						{
							struct sockaddr_in client;
							socklen_t len = sizeof(client);
							int new_fd = accept(fd,(struct sockaddr_in*)&client,&len);

							if(new_fd == -1)
							{
								perror("accept");
								continue;//失败,继续下次循环
							}

							if ( 0 == add_new_fd(&select_set,new_fd) )//add yes
							{
								//do nothing
							}
							else//add failed,array is full
							{
								close(fd);  //资源不足,暂时请求失败
							}
							continue;
						}
						//不是监听sock
						if( fd != _FD_DEFAULT_VAL_ && FD_ISSET(fd,&r_set) )
						{//read 就绪
							if( 0 == read_data_show(fd) )
							{
								delete_new_fd(&select_set,fd);
								close(fd);
							}
							else
							{
								//do nothing
							}
						}
					}
					
				}
				break;
						
		 }

	}

	return 0;
}
Example #2
0
void *workerFn(void *param)
{
    while (1) {
        struct epoll_event events[EVENT_LEN];
        int n = epoll_wait(epollfd, events, EVENT_LEN, 10000);
        if (n < 0) {
            if (errno == EINTR) {
                continue;
            }
            perror("epoll_wait error");
            exit(1);
        }
        int i;
        int reenable = 1;
        for (i = 0; i < n; ++i) {
            if (events[i].data.fd == listenfd) {
                int fd = accept(listenfd, NULL, NULL);
                if (fd > 0) {
                    add_new_fd(fd);
                } else {
                    perror("accept error");
                    exit(1);
                }
            } else {
                char buf[1024];
                while (1) {
                    ssize_t n = recv(events[i].data.fd, buf, sizeof(buf), MSG_DONTWAIT); 
                    if (n == 0) {
                        reenable = 0;
                        close_fd(events[i].data.fd);
                        break;
                    } else if (n < 0) {
                        if (errno == EINTR) {
                            continue;
                        } else if (errno == EAGAIN) {
                            break;
                        } else {
                            reenable = 0;
                            close_fd(events[i].data.fd);
                            break;
                        }
                    } else {
                        __sync_fetch_and_add(&packets, 1);
                        int pos = 0;
                        while (pos < n) {
                            int sent = send(events[i].data.fd, buf+pos, n-pos, 0);
                            if (sent <= 0) {
                                break;
                            }
                            pos += sent;
                        }
                        if (pos < n) {
                            reenable = 0;
                            close_fd(events[i].data.fd);
                        }
                    }
                    if (n < sizeof(buf)) {
                        break;
                    }
                }
            }

            if (reenable) {
                reenable_fd(events[i].data.fd);
            }
        }
    }
}