Пример #1
0
void my_epoll::add_event(int fd){
	struct epoll_event ev;
	ev.events = EPOLLIN|EPOLLET;
	ev.data.fd = fd;
	epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
	set_noblock(fd);
}
Пример #2
0
/**
 * Embeds a socket in a ssl connection.
 * @param socket the socket to be used.
 * @return The ssl connection or NULL if an error occured.
 */
int embed_ssl_socket(ssl_connection *ssl, int socket) {
  int ssl_error;
  time_t ssl_time;
  
  if (!ssl)
    return FALSE;
  
  if (!ssl_initialized)
    start_ssl();

  if (socket >= 0) {
    ssl->socket = socket;
  } else {
    LogError("%s: Socket error!\n", prog);
    goto sslerror;
  }

  if ((ssl->handler = SSL_new (ssl->ctx)) == NULL) {
    LogError("%s: Cannot initialize the SSL handler -- %s\n", prog, SSLERROR);
    goto sslerror;
  }

  set_noblock(ssl->socket);

  if ((ssl->socket_bio = BIO_new_socket(ssl->socket, BIO_NOCLOSE)) == NULL) {
    LogError("%s: Cannot generate IO buffer -- %s\n", prog, SSLERROR);
    goto sslerror;
  }

  SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);
  ssl_time = time(NULL);

  while ((ssl_error = SSL_connect (ssl->handler)) < 0) {
    if ((time(NULL) - ssl_time) > SSL_TIMEOUT) {
      LogError("%s: SSL service timeout!\n", prog);
      goto sslerror;
    }

    if (!handle_error(ssl_error, ssl))
      goto sslerror;

    if (!BIO_should_retry(ssl->socket_bio))
      goto sslerror;
  }

  ssl->cipher = (char *) SSL_get_cipher(ssl->handler);

  if (! update_ssl_cert_data(ssl)) {
    LogError("%s: Cannot get the SSL server certificate!\n", prog);
    goto sslerror;
  }

  return TRUE;

sslerror:
  cleanup_ssl_socket(ssl);
  return FALSE;
} 
Пример #3
0
static struct ISIL_EV_TASK *create_enc_task_ev( int fd )
{
    struct ISIL_EV_ARG_T *ev_arg;
    struct ISIL_EV_TASK *ev_task;

    if( fd <= 0 ) {
        return NULL;
    }

    ev_task = ev_task_minit();

    if(!ev_task) {
        fprintf(stderr,"ev_task_minit err .\n");
        return NULL;
    }

    set_noblock(fd);

    SET_EV_TASK_FD(ev_task, fd);
    

#ifdef ENCUSEMULTITHREAD
    
    if(enc_task_thr_alloc_task(ev_task) < 0 ) {
        
        
        ev_task->release(ev_task);

        return NULL;

    }

    reg_ev_task_callback(ev_task ,NULL, put_date_to_data_list);

#else

    struct ISIL_TASK_MGT *task_mgt =get_glb_task_mgt(); 
    task_mgt->put_ev_task_to_act(task_mgt,ev_task);

    reg_ev_task_callback(ev_task ,NULL, put_date_to_consumer_cb);
    
#endif 

    ev_arg = get_ev_task_arg(ev_task);
    reg_ev_to_loop( ev_arg ,GET_EV_TASK_FD(ev_task), EVENT_READ| EVENT_PERSIST,NULL , data_handle_ev_cb ,ev_task);

   
    return ev_task;

}
Пример #4
0
bool
No1SocketClient::create_socket()
{
	m_sock_fd = ::socket(AF_INET, SOCK_STREAM, 0);
	if (m_sock_fd < 0)
	{
		GLOBAL_LOG_SEV(error, "Failed to create socket: " << strerror(errno));
		return false;
	}

	if (!set_noblock(m_sock_fd))
	{
		GLOBAL_LOG_SEV(error, "Failed to set noblock!!!!");
		return false;
	}

	struct sockaddr_in client_addr;
	client_addr.sin_family = AF_INET;
	client_addr.sin_addr.s_addr = htons(INADDR_ANY);
	client_addr.sin_port = htons(0);


	if (bind(m_sock_fd, (struct sockaddr*)(&client_addr), sizeof(struct sockaddr)) < 0)
	{
		GLOBAL_LOG_SEV(error, "Failed to bind socket: " << strerror(errno));
		return false;
	}

	struct sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_aton(m_remote_addr.data(), &(server_addr.sin_addr));
	server_addr.sin_port = htons(m_remote_port);
	if (connect(m_sock_fd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) < 0)
	{
		GLOBAL_LOG_SEV(error, "Failed to connect to server: " << strerror(errno));
		return false;
	}
	return true;
}
Пример #5
0
int main(int argc, char **argv) {
    int err;
    sigset_t oldmask;
    pthread_t tid;

    sigemptyset(&mask);
    sigaddset(&mask, SIGPIPE); //向信号集中添加SIGPIPE
    if ((err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0)
        log_exit(err, "SIG_BLOCK error");
    err = pthread_create(&tid, NULL, sig_handler, 0);
    if (err != 0)
        log_exit(err, "Cannot create thread!");

    init_config();
    int listenfd = initserver();
    set_noblock(listenfd);
    threadpool_t *tp = threadpool_create(8);
    main_loop(tp, listenfd);

    threadpool_join(tp);
    exit(0);
}
Пример #6
0
int
udp_sock_server(char *host, int port)
{
    int fd;
    int ret;

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd == -1) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("create socket error: %s\n",  errbuf);
        return -1;
    }
    
    set_noblock(fd);

    struct sockaddr_in sin;

    sin.sin_family = AF_INET;
    sin.sin_port = htons((short)port);
    if (host == NULL || host[0] == 0) {
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
    }else{
        sin.sin_addr.s_addr = inet_addr(host);
    }
    memset(&(sin.sin_zero), 0, sizeof(sin.sin_zero)); 

    DINFO("bind to: %d\n", port);
    ret = bind(fd, (struct sockaddr *)&sin, sizeof(sin));
    if (ret == -1) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("bind error: %s\n",  errbuf);
        close(fd);
        return -1;
    }
    DINFO("----------fd: %d\n", fd);    
    return fd;
}
Пример #7
0
/**
 * Embeds an accepted server socket in an existing ssl connection.
 * @param ssl ssl connection
 * @param socket the socket to be used.
 * @return TRUE, or FALSE if an error has occured.
 */
int embed_accepted_ssl_socket(ssl_connection *ssl, int socket) {
  int ssl_error;
  time_t ssl_time;

  ASSERT(ssl);
  
  ssl->socket = socket;

  if (!ssl_initialized)
    start_ssl();

  if (!(ssl->handler = SSL_new(ssl->ctx))) { 
    LogError("%s: Cannot initialize the SSL handler -- %s\n", prog, SSLERROR);
    return FALSE;
  } 

  if (socket < 0) {
    LogError("%s: Socket error!\n", prog);
    return FALSE;
  }

  set_noblock(ssl->socket);

  if (!(ssl->socket_bio = BIO_new_socket(ssl->socket, BIO_NOCLOSE))) {
    LogError("%s: Cannot generate IO buffer -- %s\n", prog, SSLERROR);
    return FALSE;
  }

  SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);

  ssl_time = time(NULL);
  
  while ((ssl_error = SSL_accept(ssl->handler)) < 0) {

    if ((time(NULL) - ssl_time) > SSL_TIMEOUT) {
      LogError("%s: SSL service timeout!\n", prog);
      return FALSE;
    }

    if (!handle_error(ssl_error, ssl))
      return FALSE;

    if (!BIO_should_retry(ssl->socket_bio))
      return FALSE;

  }

  ssl->cipher = (char *)SSL_get_cipher(ssl->handler);

  if (!update_ssl_cert_data(ssl) && ssl->clientpemfile) {
    LogError("%s: The client did not supply a required client certificate!\n",
	  prog);
    return FALSE;
  }

  if (SSL_get_verify_result(ssl->handler) > 0) {
    LogError("%s: Verification of the certificate has failed!\n", prog);
    return FALSE;
  }

  return TRUE;
}
Пример #8
0
/**
 * Embeds a socket in a ssl connection.
 * @param socket the socket to be used.
 * @return The ssl connection or NULL if an error occured.
 */
int embed_ssl_socket (ssl_connection *ssl, int socket) {

#ifdef HAVE_OPENSSL

    int ssl_error;
    time_t ssl_time;

    if ( ssl == NULL ) {

        return FALSE;

    }

    if (!ssl_initilized) {

        start_ssl();

    }

    if ( socket >= 0 ) {

        ssl->socket= socket;

    } else {

        log("%s: embed_ssl_socket (): Socket error!\n", prog);
        goto sslerror;
    }

    if ((ssl->handler= SSL_new (ssl->ctx)) == NULL ) {

        handle_ssl_error("embed_ssl_socket()");
        log("%s: embed_ssl_socket (): Cannot initialize the SSL handler!\n",
            prog);
        goto sslerror;

    }

    set_noblock(ssl->socket);

    if((ssl->socket_bio= BIO_new_socket(ssl->socket, BIO_NOCLOSE)) == NULL) {

        handle_ssl_error("embed_ssl_socket()");
        log("%s: embed_ssl_socket (): Cannot generate IO buffer!\n", prog);
        goto sslerror;

    }

    SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);

    ssl_time=time(NULL);

    while((ssl_error= SSL_connect (ssl->handler)) < 0) {

        if((time(NULL)-ssl_time) > SSL_TIMEOUT) {

            log("%s: embed_ssl_socket (): SSL service timeout!\n",
                prog);
            goto sslerror;

        }

        if (!handle_connection_error(ssl_error, ssl, "embed_ssl_socket()", SSL_TIMEOUT)) {

            goto sslerror;

        }

        if (!BIO_should_retry(ssl->socket_bio)) {

            goto sslerror;

        }


    }

    ssl->cipher= (char *) SSL_get_cipher(ssl->handler);

    if (! update_ssl_cert_data(ssl)) {

        log("%s: embed_ssl_socket (): Cannot get the SSL server certificate!\n",
            prog);
        goto sslerror;

    }

    return TRUE;

sslerror:

    cleanup_ssl_socket(ssl);
    return FALSE;

#else

    return FALSE;

#endif
}
Пример #9
0
/**
 * Embeds an accepted server socket in an existing ssl connection.
 * @param ssl ssl connection
 * @param socket the socket to be used.
 * @return TRUE, or FALSE if an error has occured.
 */
int embed_accepted_ssl_socket(ssl_connection *ssl, int socket) {

#ifdef HAVE_OPENSSL

    int ssl_error;
    time_t ssl_time;

    ASSERT(ssl);

    ssl->socket=socket;

    if(!ssl_initilized) {

        start_ssl();

    }

    if((ssl->handler= SSL_new(ssl->ctx)) == NULL) {

        handle_ssl_error("embed_accepted_ssl_socket()");
        log("%s: embed_accepted_ssl_socket(): Cannot initialize the"
            " SSL handler!\n", prog);
        goto sslerror;

    }

    if(socket < 0) {

        log("Socket error!\n");
        goto sslerror;

    }

    set_noblock(ssl->socket);

    if((ssl->socket_bio= BIO_new_socket(ssl->socket, BIO_NOCLOSE)) == NULL) {

        handle_ssl_error("embed_accepted_ssl_socket()");
        log("%s: embed_accepted_ssl_socket(): Cannot generate IO buffer!\n",
            prog);
        goto sslerror;

    }

    SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);

    ssl_time= time(NULL);

    while((ssl_error= SSL_accept(ssl->handler)) < 0) {

        if((time(NULL)-ssl_time) > SSL_TIMEOUT) {

            log("%s: embed_accepted_ssl_socket(): SSL service timeout!\n",
                prog);
            goto sslerror;

        }

        if (!handle_connection_error(ssl_error, ssl,
                                     "embed_accepted_ssl_socket()", SSL_TIMEOUT)) {

            goto sslerror;

        }

        if (!BIO_should_retry(ssl->socket_bio)) {

            goto sslerror;

        }

    }

    ssl->cipher= (char *) SSL_get_cipher(ssl->handler);

    if(!update_ssl_cert_data(ssl) && (ssl->clientpemfile != NULL)) {

        log("%s: The client did not supply a required client certificate!\n",
            prog);
        goto sslerror;

    }

    if (SSL_get_verify_result(ssl->handler)>0) {

        log("%s: Verification of the certificate has failed!\n",
            prog);
        goto sslerror;

    }

    return TRUE;

sslerror:

    return FALSE;

#else

    return FALSE;

#endif

}
Пример #10
0
int connect_to_server(int fd, struct sockaddr_in serv_addr){
	int ret = 0;
	
	if (set_noblock(fd)){
		set_noblock(fd);
	}
	
	ret = -1;
	if ((ret = connect(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))) != 0) {

		if (errno != EINPROGRESS){
			LOG("Connection is under building error=%d, %s\n", errno, strerror(errno));
			goto SEL_ERROR;
		}
		else {
			struct timeval tm = {5, 0};  
			fd_set wset;
			
			FD_ZERO(&wset);
			FD_SET(fd,&wset);
			
			while (1) {
				int res = select(fd+1,NULL,&wset,NULL,&tm);  

				if(res < 0)  
				{
					if(ret == -1 && errno == EINTR)
						continue;
					LOG("network error in connect\n");  
					goto SEL_ERROR;
				}
				else if(res == 0)  
				{  
					LOG("connect time out\n");  
					goto SEL_ERROR;
				}
				else
				{
					if(FD_ISSET(fd,&wset))  
					{
						int err = 0;
						int len = sizeof(err);
						getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*)&err, (socklen_t *)&len);
						if (0 == err) {
							//LOG("connect succeed.\n");  
							goto SEL_SUCC;
						} else {
							LOG("connect failed due to error %d.\n", err);  
							goto SEL_ERROR;
						}
					}
					else
					{
						LOG("other error when select:%s\n",strerror(errno));  
						goto SEL_ERROR;
					}
				}
			}
		}
	}
	
	
	
SEL_ERROR:
	if(set_blocking(fd)){
		set_blocking(fd);
	}
	return -1;
	
SEL_SUCC:
	if(set_blocking(fd)){
		set_blocking(fd);
	}
	return 0;
}
Пример #11
0
int create_alarm_ev(unsigned int chipid )
{
    int fd;
    struct ISIL_EV_TASK * ev_task;
    struct ISIL_EV_ARG_T *ev_arg;
    IO_NODE_MGT *io_mgt = NULL;

    io_mgt = get_io_node_mgt_by_type_id(chipid , NODE_TYPE_VI);
    if( !io_mgt ) {
        fprintf( stderr,"get_io_node_mgt_by_type_id err .\n");
        return -1;
    }

#if 0
    if(io_mgt->is_enable != 1 ) {
        fprintf( stderr,"io_mgt  is_enable err .\n");
        return -1;
    }
#endif

    if(io_mgt->priv) {
    	DEBUG_FUNCTION();
        return 0;
    }

    fd = io_mgt->fd;

    if( fd <= 0 ) {
    	DEBUG_FUNCTION();
        return -1;
    }

    DEBUG_FUNCTION();
    ev_task = ev_task_minit();

    if(!ev_task) {
        fprintf(stderr,"ev_task_minit err .\n");
        return -1;
    }

    DEBUG_FUNCTION();

    io_mgt->priv = (void *)ev_task;

    set_noblock(fd);

    SET_EV_TASK_FD(ev_task, fd);

    fprintf(stderr,"Alarm fd[%d].\n",fd);
    chip_fd_map[chipid] = fd;
    
    struct ISIL_TASK_MGT *task_mgt =get_glb_task_mgt(); 

    task_mgt->put_ev_task_to_act(task_mgt,ev_task);

    reg_ev_task_callback(ev_task ,NULL, put_alarm_to_consumer_cb);


    ev_arg = get_ev_task_arg(ev_task);
    if( !ev_arg ) {
        return -1;
    }

    reg_ev_to_loop( ev_arg ,GET_EV_TASK_FD(ev_task), EVENT_READ| EVENT_PERSIST,NULL , alarm_handle_ev_cb ,ev_task);
    DEBUG_FUNCTION();
    return 0;
    
}
Пример #12
0
int
tcp_socket_connect(char *host, int port, int timeout, int block)
{
    int fd;
    int ret;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("create socket error: %s\n",  errbuf);
        return -1;
    }
    
    if (block == FALSE)
        set_noblock(fd);

    struct linger ling = {1, 0};
    ret = setsockopt(fd, SOL_SOCKET, SO_LINGER, (void *)&ling, sizeof(ling));
    if (ret != 0) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("setsockopt LINGER error: %s\n",  errbuf);
        return -1;
    }

    int flags = 1;
    ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&flags, sizeof(flags));
    if (ret != 0) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("setsockopt NODELAY error: %s\n",  errbuf);
        return -1;
    }
    
    ret = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags));
    if (ret != 0) {
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DERROR("setsockopt KEEPALIVE error: %s\n",  errbuf);
        return -1;
    }
    
    struct sockaddr_in  sin;

    sin.sin_family = AF_INET;
    sin.sin_port = htons((short)port);
    if (NULL == host || 0 == host[0]) {
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
    }else{
        sin.sin_addr.s_addr = inet_addr(host);
    }

    DINFO("connect to %s:%d\n", host, port);
    do {
        ret = connect(fd, (struct sockaddr*)&sin, sizeof(sin));
    } while (ret == -1 && errno == EINTR);
    
    DINFO("ret: %d\n", ret);
    if (ret == -1) {
        if (errno == EINPROGRESS || errno == EALREADY || errno == EWOULDBLOCK || errno == 0 || errno == EISCONN)
            return fd;
        char errbuf[1024];
        strerror_r(errno, errbuf, 1024);
        DWARNING("connect error: %s\n",  errbuf);
        close(fd);
        return -1;
    }

    return fd;
}
Пример #13
0
int main(int argc,char *argv[])
{
    if(argc != 3){
        printf("please use:%s [ip] [port]",argv[0]);
        exit(1);
    }
    int listen_sock = creat_socket(argv[1],argv[2]);

    int epoll_fd = epoll_create(256);
    if(epoll_fd < 0){
        perror("epoll creat");
        exit(6);
    }

    struct epoll_event ep_ev;
    ep_ev.events = EPOLLIN;//数据的读取
    ep_ev.data.fd = listen_sock;

    //添加关心的事件
    if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,listen_sock,&ep_ev) < 0){
        perror("epoll_ctl");
        exit(7);
    }

    struct epoll_event ready_ev[128];//申请空间来放就绪的事件。
    int maxnum = 128;
    int timeout = 1000;//设置超时时间,若为-1,则永久阻塞等待。
    int ret = 0;
    
    int done = 0;
    while(!done){
        switch(ret = epoll_wait(epoll_fd,ready_ev,maxnum,timeout)){
            case -1:
                perror("epoll_wait");
                break;
            case 0:
                printf("time out...\n");
                break;
            default://至少有一个事件就绪
            {
                int i = 0;
                for(;i < ret;++i){
                    //判断是否为监听套接字,是的话accept
                    int fd = ready_ev[i].data.fd; 
                    if((fd == listen_sock) && (ready_ev[i].events & EPOLLIN)){
                        struct sockaddr_in remote;
                        socklen_t len = sizeof(remote);

                        int accept_sock = accept(listen_sock,(struct sockaddr*)&remote,&len);
                        if(accept_sock < 0){
                            perror("accept");
                            continue;
                        }
                        printf("accept a client..[ip]: %s,[port]: %d\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
                        //将新的事件添加到epoll集合中
                        ep_ev.events = EPOLLIN | EPOLLET;
                        ep_ev.data.fd = accept_sock;

                        set_noblock(accept_sock);

                        if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,accept_sock,&ep_ev) < 0){
                            perror("epoll_ctl");
                            close(accept_sock);
                        }
                    }
                    else{//普通IO
                         if(ready_ev[i].events & EPOLLIN){
                             //申请空间同时存文件描述符和缓冲区地址

                             char buf[102400];
                             memset(buf,'\0',sizeof(buf));

                             ssize_t _s = recv(fd,buf,sizeof(buf)-1,0);
                             if(_s < 0){
                                 perror("recv");
                                 continue;
                             }else if(_s == 0){
                                 printf("remote close..\n");
                                //远端关闭了,进行善后
                                 epoll_ctl(epoll_fd,EPOLL_CTL_DEL,fd,NULL);
                                 close(fd);
                             }else{
                                 //读取成功,输出数据
                                 printf("client# %s",buf);
                                 fflush(stdout);

                                 //将事件改写为关心事件,进行回写
                                 ep_ev.data.fd = fd;
                                 ep_ev.events = EPOLLOUT | EPOLLET;

                                 //在epoll实例中更改同一个事件
                                 epoll_ctl(epoll_fd,EPOLL_CTL_MOD,fd,&ep_ev);
                             }
                         }else if(ready_ev[i].events & EPOLLOUT){
                                 const char*msg = "HTTP/1.1 200 OK \r\n\r\n<h1> hi girl </h1>\r\n";
                                 send(fd,msg,strlen(msg),0);
                                 epoll_ctl(epoll_fd,EPOLL_CTL_DEL,fd,NULL);
                                 close(fd);
                            }
                        }
                    }
                }
                break;
            
        }
    }
    close(listen_sock);
    return 0;
}