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; }
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; }
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); }
/** \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; }