Beispiel #1
0
static int internal_setsock_opt(int sock, int islisten)
{
    int authorization;
    struct linger linger;
    int TCP_buffers;

    /* make it possible to reuse the socket */
    if (islisten & SOCK_LISTEN_FLAGS)
    {
        authorization = 1;
        if (os_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
		          &authorization, sizeof(authorization)) < 0)
            goto error;
    }

    if (islisten & SOCK_FLAGS)
    {
        /* tcp_nodelay : deactivate the nagle algorithm + linger to
           immediatly shutdown a socket + setting the good send/recv
           size of tcp buffer */
        authorization = 1;
        if (os_setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
		          &authorization, sizeof(authorization)) < 0)
            goto error;

#ifdef USE_EXA_COMMON_KMODULE
        /* Set the socket kernel allocation to GFP_ATOMIC */
        if (exa_socket_set_atomic(sock) < 0)
            goto error;
#endif

        /* Set the size of the socket TCP send buffers */
	TCP_buffers = 65536;
        if (os_setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
		          &TCP_buffers, sizeof(TCP_buffers)) < 0)
            goto error;

        /* Set the size of the socket TCP receive buffers */
        TCP_buffers = 128 * 1024;
        if (os_setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
		          &TCP_buffers, sizeof(TCP_buffers)) < 0)
            goto error;

        /* Fix the delay in socket shutdown */
        linger.l_onoff = 1;
        linger.l_linger = 0;
        if (os_setsockopt(sock, SOL_SOCKET, SO_LINGER,
                          &linger, sizeof(linger)) < 0)
            goto error;
    }

    return EXA_SUCCESS;

error:
    return -EXA_ERR_CREATE_SOCKET;
}
Beispiel #2
0
int 
main(int argc, char *argv[])
{
	int listenfd;
	int connfd;
	int on = 1;
	struct sockaddr_in serv_addr, cli_addr;
	socklen_t cli_len;
	pid_t childpid;

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		fprintf(stderr, "socket error: %s\n", strerror(errno));
		exit(1);
	}

	os_setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

	bzero(&serv_addr, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(SERV_PORT);

	if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
		fprintf(stderr, "bind error: %s\n", strerror(errno));
		exit(1);
	}
	
	if (listen(listenfd,  LISTEN_QUEUE) < 0) {
		fprintf(stderr, "listern error: %s\n", strerror(errno));
		exit(1);
	}

	os_signal(SIGCHLD, sig_chld);

	for (; ;) {
		cli_len = sizeof(cli_addr);
	    if ((connfd = accept(listenfd, (struct sockaddr *)&cli_addr, &cli_len)) < 0) {
			if (errno == EINTR)
				continue;
			else
				os_err_sys("accept error");
		}

			
		if ((childpid = fork()) == 0) {
			close(listenfd);
			echo_string(connfd);
			exit(1);
		}
		close(connfd);
	}
	return 0;
}
Beispiel #3
0
ut_setup()
{
    int len;
    struct in_addr addr;
    int reuse;

    UT_ASSERT(!os_net_init());

    /* create sockets */
    server_sock = os_socket(AF_INET, SOCK_STREAM, 0);
    UT_ASSERT(server_sock >= 0);

    reuse = 1;
    UT_ASSERT(os_setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR,
			    &reuse, sizeof(reuse)) >= 0);

    client_sock = os_socket(AF_INET, SOCK_STREAM, 0);
    UT_ASSERT(client_sock >= 0);

    /* fill in server information */
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(DATA_PORT);

    /* bind sockets */

    UT_ASSERT(os_bind(server_sock, (struct sockaddr *)&server_addr,
		      sizeof(server_addr)) >= 0);

    UT_ASSERT(os_listen(server_sock, BACKLOG) >= 0);

    /* connect to server */
    os_inet_aton("127.0.0.1", &addr);
    memset(&client_addr, 0, sizeof(client_addr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = addr.s_addr;
    client_addr.sin_port = htons(DATA_PORT);
    if (os_connect(client_sock, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0)
	UT_FAIL();

    len = sizeof(struct sockaddr_in);
    accept_sock = os_accept(server_sock, (struct sockaddr *)&server_addr, &len);
    UT_ASSERT(accept_sock >= 0);
}
Beispiel #4
0
/** \brief Return a descritor on a socket that allow us to wait GUI/CLI Request
 *
 * \param[in] port: The IP port to wait on
 * \return Return a descritor on a socket if > 0 or a negative error code
 */
static int
listen_socket_port(int port)
{
  int sd;
  struct sockaddr_in sin;
  int autorisation;
  int retval;

  /* get an internet domain socket */
  if ((sd = os_socket (AF_INET, SOCK_STREAM, 0)) < 0)
    return sd;

  /* Change socket options to be able to restart the daemon right
   * after it has been stopped -- otherwise, bind() would block for
   * 60 secs because of TCP */
  autorisation = 1;
  os_setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &autorisation, sizeof(int));

  /* complete the socket structure */
  memset(&sin, 0, sizeof (sin));
  sin.sin_family = AF_INET;
  sin.sin_addr.s_addr = INADDR_ANY;
  sin.sin_port = htons (port);

  /* bind the socket to the port number */
  retval = os_bind(sd, (struct sockaddr *) &sin, sizeof (sin));
  if (retval < 0)
    return retval;

  /* show that we are willing to listen */
  retval = os_listen (sd, 5);
  if (retval < 0)
    return retval;

  return sd;
}
int 
main(int argc, char *argv[])
{
	int listenfd;
	int connfd;
	int on = 1;
	struct sockaddr_in serv_addr, cli_addr;
	socklen_t cli_len;
	int client_fd[FD_SETSIZE];/* each for every client  */
	fd_set allset; /* save interested descriptors */
	fd_set rdset; /* select on this set */
	int maxfd;
	int max_indx; /* max index in client_fd[] array */
	int i, n;
	int nready;
	char buf[MAXLINE];

	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		fprintf(stderr, "socket error: %s\n", strerror(errno));
		exit(1);
	}

	os_setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

	bzero(&serv_addr, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(SERV_PORT);

	if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
		fprintf(stderr, "bind error: %s\n", strerror(errno));
		exit(1);
	}
	
	if (listen(listenfd,  LISTEN_QUEUE) < 0) {
		fprintf(stderr, "listern error: %s\n", strerror(errno));
		exit(1);
	}

	for (i=0; i < FD_SETSIZE; i++)
		client_fd[i] = -1;
	
	FD_ZERO(&allset);
	FD_SET(listenfd, &allset);
	maxfd = listenfd;
	max_indx = 0;
	for (; ;) {
		rdset = allset;
		nready  = os_select(maxfd + 1, &rdset, NULL, NULL, NULL); /* select will modify rdset once return */

		/* task 1: listen... accept new connection */
		if(FD_ISSET(listenfd, &rdset)) {
			cli_len = sizeof(cli_addr);
			connfd = os_accept(listenfd, (struct sockaddr *)&cli_addr, &cli_len);

			for (i=0; i < FD_SETSIZE; i++) { /* a new client coming, select a useable fd */
				if (client_fd[i] == -1) {
					client_fd[i] = connfd;
					maxfd = (connfd > maxfd) ? connfd : maxfd;
					break;
				}
			}
			FD_SET(connfd, &allset);
			if (i > max_indx)
				max_indx = i;
			if (--nready <= 0)
				continue;  /* no more readable descriptors */
		}
		
		/* task 2: deal with all  clients' data  */
		for (i=0; i < maxfd; i++) {
			if (client_fd[i] == -1)
				continue;
			if (FD_ISSET(client_fd[i], &rdset)) {
				if ((n = os_read(client_fd[i], buf, MAXLINE)) == 0) {
					close(client_fd[i]);
					FD_CLR(client_fd[i], &allset);
					client_fd[i] = -1;
				}
				else {
#ifdef DEBUG
					os_write(fileno(stdout), buf, n);
#endif
					os_write(client_fd[i], buf, n);
				}
			}
			if (--nready <= 0)
				break;  /* no more readable descriptors */
		}
#if 0

		cli_len = sizeof(cli_addr);
	    if ((connfd = accept(listenfd, (struct sockaddr *)&cli_addr, &cli_len)) < 0) {
			if (errno == EINTR)
				continue;
			else
				os_err_sys("accept error");
		}

			
		if ((childpid = fork()) == 0) {
			close(listenfd);
			echo_string(connfd);
			exit(1);
		}
		close(connfd);
#endif
	}
	return 0;
}