Exemplo n.º 1
0
int main(int argc,char *argv[])
{
    void thread_make(int);
    int i,nthreads;
    socklen_t addrlen;

    if(argc<3||argc>4)
        err_quit("usage:server [<host>] <port#> <#threads>");

    daemon_init(argv[0],0);  /*守护进程化当前进程*/

    if(argc==3)
    {
        listenfd=Tcp_listen(NULL,argv[1],&addrlen);
    }
    else if(argc==4)
    {
        listenfd=Tcp_listen(argv[1],argv[2],&addrlen);
    }

    nthreads=atoi(argv[argc-1]);
    tptr=Calloc(nthreads,sizeof(pthread_t));
    for(i=0; i<nthreads; i++)
    {
        thread_make(i);
    }
    for(;;)
        pause();
}
int main(int argc,char* argv[])
{
    int i, navail, maxfd, nsel, connfd, rc;
    socklen_t clilen;
    // host info of server
    struct sockaddr_in servaddr;   
    // host info of client
    struct sockaddr_in cliaddr;    
    // value to enable SOL_SOCKET
    const int ON = 1;              

    // initialize server socket
    listenfd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &ON, sizeof(ON));
    bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
    listen(listenfd, LISTENQ);

    // initialize thread pool
    // number of threads in the pool
    nthreads = 10;          
    tptr = calloc(nthreads, sizeof(Thread));
    iget = iput = 0;
    for (i = 0; i < nthreads; ++i)
    {
        thread_make(i);
    }

    // register signal SIGINT
    signal(SIGINT, sig_int);

    // wait for client connection
    for (;;)
    {
        connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
        echo("[SERVICE] accept a connect from %s.\n", inet_ntoa(cliaddr.sin_addr));
        // protect clifd[] and iput/iget
        pthread_mutex_lock(&clifd_mutex);  
        //echo("[SERVER] get lock, thread = [main]\n");
        // iput point to next idle position
        clifd[iput] = connfd;              
        if (++iput == MAXCLIENT)
            iput = 0;
        // the queue overflowed
        if (iput == iget)                  
            errexit("[SERVER] Error: too much clients !");
        pthread_cond_signal(&clifd_cond);
        pthread_mutex_unlock(&clifd_mutex);
    }

    return 0;
}
Exemplo n.º 3
0
int main(int argc, char *argv[])
{
    if(argc <= 4)
    {
        printf("usage: %s ip_address port_number file_name  nthreads", basename(argv[0]));
        return 1;
    }

    const char* ip = argv[1];
    int port = atoi(argv[2]);
    const char* file_name = argv[3];
    nthreads = atoi(argv[4]);
    tptr = (Thread *)calloc(nthreads, sizeof(nthreads));

    int filefd = open(file_name, O_RDONLY);
    printf("%d****", filefd);
    assert(filefd > 0);
    fstat(filefd, &stat_buf);

    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int sock = socket(PF_INET, SOCK_STREAM, 0);
    assert(sock >= 0);

    int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));
    assert(ret != -1);

    ret = listen(sock, 5);
    assert(ret != -1);
    listenfd = sock;

    for (int i = 0; i < nthreads; ++i)
    {
        thread_make(i);
    }

    //signal(SIGINT, sig_int);

    while (1)
    {
        pause();
    }
    close(filefd);
    close(sock);
    return 0;
}
Exemplo n.º 4
0
int main(int argc, char const *argv[])
{
  struct sockaddr_in cliaddr, servaddr;
  int connfd;
  int clilen, addrlen;
  int i, nchildren;
  pthread_t tid;

  if (argc != 3)
  {
    fprintf(stderr, "usage: serv1 <#port> <#nchildren>\n");
    exit(1);
  }

  if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  {
    perror("socket error");
    exit(1);
  }

  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(atoi(argv[1]));
  servaddr.sin_addr.s_addr = htons(INADDR_ANY);

  nchildren = atoi(argv[2]);

  if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
  {
    perror("bind error");
    exit(1);
  }

  if (listen(listenfd, LISTENQ) < 0)
  {
    perror("listen error");
    exit(1);
  }

  Signal(SIGINT, sig_int);

  for (i = 0; i < nchildren; ++i)
    thread_make(i);

  for ( ; ; )
    pause();

  return 0;
}
Exemplo n.º 5
0
// prethread with only main thread doing accept()
void chat_server()
{
	printf("chat server start\n");
	void sig_chld(int);
	pid_t childpid;
	socklen_t clilen;
	struct sockaddr_in cliaddr ;
	int clifd[MAXNCLI];

	if(sock_server_init(listenfd,(uint16_t) SERVER_PORT) < 0)
	{		
		return ;
	}
	signal(SIGCHLD, sig_chld);
	char buf[200] = {0};
	
	tptr =(Thread*) calloc(maxthreads, sizeof(Thread));

	int i;
	iget = iput = 0;
	
	for( i = 0; i < maxthreads  ; i++)
	{
		thread_make(i);
	}
	for( ;  ;) 
	{
		clilen = sizeof(cliaddr);
		connfd = accept(listenfd, (SA*)&cliaddr, &clilen);
		printf("incoming connection from IP: %s Port: %d\n", 
		   inet_ntop(AF_INET, &cliaddr.sin_addr, buf, sizeof(buf)), 
		   ntohs(cliaddr.sin_port));		

		pthread_mutex_lock(&clifd_mutex);
		clifd[iput] = connfd;
		if(++iput == MAXNCLI)
		   iput = 0;
		if(iput == iget)
		   err_quit("iput = iget  ");
		pthread_cond_signal(&clifd_cond);
		pthread_mutex_unlock(&clifd_mutex);
	   		   
	}//for
}
Exemplo n.º 6
0
Arquivo: serv09.c Projeto: rkks/refer
int
main(int argc, char **argv)
{
	int		i;
	void	sig_int(int), thread_make(int);

	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv09 [ <host> ] <port#> <#threads>");
	nthreads = atoi(argv[argc-1]);
	tptr = Calloc(nthreads, sizeof(Thread));

	for (i = 0; i < nthreads; i++)
		thread_make(i);			/* only main thread returns */

	Signal(SIGINT, sig_int);

	for ( ; ; )
		pause();	/* everything done by threads */
}
Exemplo n.º 7
0
int main(int argc, char **argv)
{
	int  i;
	void sig_int(int);
	void thread_make(int);

	if (argc == 3)
		listenfd = tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4 )
		listenfd = tcp_listen(argv[1], argv[2], &addrlen);
	else
		fprintf(stderr, "usage: server_serv_thread [ <host> ] <port#> <#children>");
	
	nthreads = atoi(argv[argc - 1]);
	tptr = calloc(nthreads, sizeof(Thread));	
	for (i = 0; i < nthreads; i++)
		thread_make(i);

	signal(SIGINT, sig_int);

	for (; ; )
		pause();

}
Exemplo n.º 8
0
int main(int argc, char *argv[])
{
    struct thread *thread;
    enum pause_reason reason;
    struct variable *var;
#if ! NO_ARGV_0
    char *argv0 = "mindy";
#endif

    exec_file_name = argv[0];

    init_color(false);

    init();

    thread = thread_make(symbol("main"));
    *thread->sp++ = make_raw_function("startup", obj_Nil,
                                      true, obj_False, false,
                                      obj_Nil, obj_ObjectClass,
                                      startup);

    while (*++argv != NULL) {
        if (strcmp(*argv, "-f") == 0) {
            if (*++argv == NULL)
                missing_arg("-f");
            load(*argv);
#if ! NO_SHARP_BANG
        } else if (strcmp(*argv, "-x") == 0) {
            if (*++argv == NULL)
                missing_arg("-f");
#if ! NO_ARGV_0
            if (strcmp(*argv, "-") != 0)
                argv0 = *argv;
#endif
            load(*argv);
            argv += 1;
            break;
#endif
#if ! NO_ARGV_0
        } else if (strcmp(*argv, "-0") == 0) {
            if (*++argv == NULL)
                missing_arg("-0");
            argv0 = *argv;
#endif
        } else {
            break;
        }
    }

#if ! NO_ARGV_0
        *thread->sp++ = make_byte_string(argv0);    /* pass command name */
#endif
    while (*argv != NULL)
        *thread->sp++ = make_byte_string(*argv++);

    finalize_modules();

    while (1) {
        thread_restart(thread);

        reason = do_stuff();
        if (reason != pause_NothingToRun)
            invoke_debugger(reason);

        var = find_variable(module_BuiltinStuff, symbol("exit"),
                            false, false);
        if (var == NULL)
            lose("main undefined?");

        thread = thread_make(symbol("exit"));
        *thread->sp++ = var->value;
    }
    return 0;
}
Exemplo n.º 9
0
int start_threaded_server ( OCSPD_CONFIG * ocspd_conf )
{
	int i = 0;
	int rv = 0;

	struct sockaddr_in cliaddr;
	socklen_t cliaddrlen;

	struct sigaction sa;

	// Just print a nice log message when exits
	atexit(close_server);

	if( ocspd_conf->token ) {

		if( PKI_TOKEN_init(ocspd_conf->token, 
				ocspd_conf->token_config_dir, ocspd_conf->token_name)
								== PKI_ERR)
		{
			PKI_log_err( "Can not load default token (%s/%s)",
				ocspd_conf->cnf_filename, ocspd_conf->token_name );
			exit(1);
		}

		PKI_TOKEN_cred_set_cb ( ocspd_conf->token, NULL, NULL);

		if (PKI_TOKEN_login ( ocspd_conf->token ) != PKI_OK)
		{
			PKI_log_debug("Can not login into token!");
			exit(1);
		}

		rv = PKI_TOKEN_check(ocspd_conf->token);
		if (rv & (PKI_TOKEN_STATUS_KEYPAIR_ERR |
							PKI_TOKEN_STATUS_CERT_ERR |
							PKI_TOKEN_STATUS_CACERT_ERR))
		{
			if (rv & PKI_TOKEN_STATUS_KEYPAIR_ERR) PKI_ERROR(PKI_ERR_TOKEN_KEYPAIR_LOAD, NULL);
			if (rv & PKI_TOKEN_STATUS_CERT_ERR) PKI_ERROR(PKI_ERR_TOKEN_CERT_LOAD, NULL);
			if (rv & PKI_TOKEN_STATUS_CACERT_ERR) PKI_ERROR(PKI_ERR_TOKEN_CACERT_LOAD, NULL);

			PKI_log_err("Token Configuration Fatal Error (%d)", rv);
			exit(rv);
		}
	}

	/* Initialize all the tokens configured for the single CA entries */
	for (i = 0; i < PKI_STACK_elements(ocspd_conf->ca_list); i++)
	{
		CA_LIST_ENTRY *ca = NULL;

		if ((ca = PKI_STACK_get_num( ocspd_conf->ca_list, i )) == NULL)
			continue;

		if (ca->token_name == NULL)
			continue;

		if ((ca->token = PKI_TOKEN_new_null()) == NULL)
		{
			PKI_ERROR(PKI_ERR_MEMORY_ALLOC, NULL);
			exit (1);
		}

		PKI_TOKEN_cred_set_cb ( ocspd_conf->token, NULL, NULL);

		rv = PKI_TOKEN_init(ca->token, ca->token_config_dir, ca->token_name);
		if (rv != PKI_OK)
		{
			PKI_ERROR(rv, NULL);
			PKI_log_err ( "Can not load token %s for CA %s (%s)",
				ca->token_name, ca->ca_id, ca->token_config_dir );
			exit (rv);
		}

		rv = PKI_TOKEN_login(ca->token);
		if (rv != PKI_OK)
		{
			PKI_log_err("Can not login into token (%s)!", ca->ca_id);
			exit(rv);
		}

		rv = PKI_TOKEN_check(ca->token);
		if ( rv & (PKI_TOKEN_STATUS_KEYPAIR_ERR |
							 PKI_TOKEN_STATUS_CERT_ERR |
							 PKI_TOKEN_STATUS_CACERT_ERR))
		{
			if (rv & PKI_TOKEN_STATUS_KEYPAIR_ERR) PKI_ERROR(PKI_TOKEN_STATUS_KEYPAIR_ERR, NULL);
			if (rv & PKI_TOKEN_STATUS_CERT_ERR) PKI_ERROR(PKI_TOKEN_STATUS_CERT_ERR, NULL);
			if (rv & PKI_TOKEN_STATUS_CACERT_ERR) PKI_ERROR(PKI_TOKEN_STATUS_CACERT_ERR, NULL);

			PKI_log_err ( "Token Configuration Fatal Error (%d) for ca %s", rv, ca->ca_id);
			exit(rv);
		}
	}

	if((ocspd_conf->listenfd = PKI_NET_listen (ocspd_conf->bindUrl->addr,
					ocspd_conf->bindUrl->port, PKI_NET_SOCK_STREAM )) == PKI_ERR ) {
		PKI_log_err ("Can not bind to [%s],[%d]",
			ocspd_conf->bindUrl->addr, ocspd_conf->bindUrl->port);
		exit(101);
	}

	// Now Chroot the application
	if ((ocspd_conf->chroot_dir) && (set_chroot( ocspd_conf ) < 1))
	{
		PKI_log_err ("Can not chroot, exiting!");
		exit(204);
	}

	// Set privileges
	if (set_privileges(ocspd_conf) < 1)
	{
		if (ocspd_conf->chroot_dir != NULL)
		{
			PKI_log(PKI_LOG_ALWAYS, "SECURITY:: Can not drop privileges! [203]");
			PKI_log(PKI_LOG_ALWAYS, "SECURITY:: Continuing because chrooted");
		}
		else
		{
			PKI_log(PKI_LOG_ALWAYS, "SECURITY:: Can not drop privileges! [204]");
			PKI_log(PKI_LOG_ALWAYS, "SECURITY:: Check User/Group in config file!");
			exit(204);
		}
	}

	if((ocspd_conf->threads_list = calloc ( (size_t) ocspd_conf->nthreads, 
					sizeof(Thread))) == NULL )
	{
		PKI_log_err ("Memory allocation failed");
		exit(79);
	}

	// Creates the Threads
	for (i = 0; i < ocspd_conf->nthreads; i++)
	{
		if (thread_make(i) != 0)
		{
			PKI_log_err ("Can not create thread (%d)\n", i );
			exit(80);
		}
	}

	// Register the alarm handler
	set_alrm_handler();

	// Just print a nice log message when killed
	signal(SIGTERM, handle_sigterm );
	signal(SIGABRT, handle_sigabrt );

	// Setting the SIGHUP in order to reload the CRLs
	// sa.sa_handler = auto_crl_check;
	sa.sa_handler = force_crl_reload;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;

	if (sigaction(SIGHUP, &sa, NULL) == -1)
	{
		PKI_log_err("Error during setting sig_handler");
		exit(1);
	}

	cliaddrlen = sizeof( cliaddr );
	for ( ; ; ) 
	{
		// Acquires the Mutex for handling the ocspd_conf->connfd
		PKI_MUTEX_acquire ( &ocspd_conf->mutexes[CLIFD_MUTEX] );
		if ((ocspd_conf->connfd = PKI_NET_accept(ocspd_conf->listenfd, 0)) == -1)
		{
			// Provides some information about the error
			if (ocspd_conf->verbose || ocspd_conf->debug)
			{
				char err_str[512];
				PKI_log_err("Network Error [%d::%s]", errno,
						strerror_r(errno, err_str, sizeof(err_str)));
			}

			// Returns the connfd MUTEX and restart from the top of the cycle
			PKI_MUTEX_release(&ocspd_conf->mutexes[CLIFD_MUTEX]);
			continue;
		}

		// Some debugging information
		if (ocspd_conf->debug)
		{
			if (getpeername(ocspd_conf->connfd, (struct sockaddr*)&cliaddr, &cliaddrlen) == -1)
			{
				char err_str[512];
				PKI_log_err("Network Error [%d::%s] in getpeername", errno,
					strerror_r(errno, err_str, sizeof(err_str)));
			}

			PKI_log(PKI_LOG_INFO, "Connection from [%s]",
	 			inet_ntoa(cliaddr.sin_addr));
		}

		// Communicate that there is a good socket waiting for a thread to pickup
		PKI_COND_broadcast ( &ocspd_conf->condVars[CLIFD_COND] );
		PKI_MUTEX_release ( &ocspd_conf->mutexes[CLIFD_MUTEX] );

		// Waits for a thread to successfully pickup the socket
		PKI_MUTEX_acquire ( &ocspd_conf->mutexes[SRVFD_MUTEX] );
		while (ocspd_conf->connfd > 2)
		{
			PKI_COND_wait ( &ocspd_conf->condVars[SRVFD_COND],
				&ocspd_conf->mutexes[SRVFD_MUTEX] );
		}
		PKI_MUTEX_release ( &ocspd_conf->mutexes[SRVFD_MUTEX] );
	}

	return(0);
}
Exemplo n.º 10
0
int main(){
    int LISTEN_BACKLOG=10;
    int sfd=socket(AF_INET,SOCK_STREAM,0);	
    struct sockaddr_in my_addr, their_addr;
    if(sfd==-1){
	fprintf(stderr,"socket error\n");
	exit(1);
    }
    //struct sockaddr addr;
    my_addr.sin_family=AF_INET;                
    my_addr.sin_port = htons(9100);            
    my_addr.sin_addr.s_addr = INADDR_ANY; 
    bzero(&(my_addr.sin_zero), 8);               
    if(bind(sfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
	fprintf(stderr,"bind error\n");
	exit(1);
    }
    if(listen(sfd,LISTEN_BACKLOG)==-1){
	fprintf(stderr,"listen error\n");
	exit(1);
    }
	int nfds;
	m_epollfd=epoll_create(QUEUELEN);
	struct epoll_event m_epollev[QUEUELEN];
	struct epoll_event ev;
	ev.data.fd=sfd;
	ev.events=EPOLLIN|EPOLLET;
	epoll_ctl(m_epollfd,EPOLL_CTL_ADD,sfd,&ev);

	int sockfd=0;int i=0;
	int sock;
	socklen_t sin_size;
	   
	thread_make(THREAD_NUM);

	while(1){
//	epoll
	//if recv,lock sockArray[sockRear++]=sock; unlock;
	//read rear=(rear+1)%QUEUELEN	sockArray[rear]=sock;
	nfds=epoll_wait(m_epollfd,m_epollev,QUEUELEN,-1);
	for(i=0;i<nfds;i++)
	{
		sockfd=m_epollev[i].data.fd;
		struct epoll_event _event=m_epollev[i];
		if(sfd==sockfd)
		{
			//accept
			sin_size=sizeof(struct sockaddr);
			sock=accept(sfd,(void*)&their_addr,&sin_size);
			ev.data.fd=sock;
			ev.events=EPOLLIN|EPOLLET;
			epoll_ctl(m_epollfd,EPOLL_CTL_ADD,sock,&ev);
		}
		else if(_event.events&EPOLLIN)
		{
		//lock
			pthread_mutex_lock(&mlock);
			if(sockFront==((sockRear+1)%QUEUELEN))
			{
				printf("GET TO THE MAX LIMIT %d\n",QUEUELEN);
				pthread_mutex_unlock(&mlock);
				continue;
			}
			sockRear=(sockRear+1)%QUEUELEN;
			sockArray[sockRear]=sockfd;
			printf("here we are %d\n",sockfd);
			pthread_mutex_unlock(&mlock);
			pthread_cond_signal(&m_condlock);	
		//unlock
		}
		else
			printf("epoll:else\n");
	}
    }
}