/* ** @brief change port when we can't listen ** ** @param s our server's structure ** @param i our current port ** @param sck the socket ** @param j a port ** ** @return -1 if we reached our MAX_PORT or 0 */ static int _change_port(t_server *s, int i, int sck, int j) { t_sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(s->ports[i]); sin.sin_addr.s_addr = INADDR_ANY; if (s->ports[i] <= 1023) { nbr_log("port to low (1 - 1023 not allowed) :", s->ports[i], "_change_port", TYPE_ERROR); s->ports[i] = 1024; } while (s->ports[i] < MAX_PORT && my_bind(sck, (const t_sockaddr *)&sin, sizeof(sin), s->ports[i]) == -1) { ++s->ports[i]; sin.sin_port = htons(s->ports[i]); } while (s->ports[j] != -1) { s->ports[j] = s->ports[j - 1]; ++j; } return (s->ports[i] == MAX_PORT ? -1 : 0); }
static void listen_connect_drop(void) { struct sockaddr_in sin; int slisten, sconnect, sv[2]; int inflight, openfiles; socklen_t len; test = "listen_connect_drop"; printf("%s\n", test); save_sysctls(&inflight, &openfiles); slisten = my_socket(PF_INET, SOCK_STREAM, 0); my_bind(slisten, (struct sockaddr *)&sin, sizeof(sin)); my_listen(slisten, -1); my_socketpair(sv); len = sizeof(sin); my_getsockname(slisten, (struct sockaddr *)&sin, &len); sconnect = my_socket(PF_INET, SOCK_STREAM, 0); setnonblock(sconnect); my_connect(sconnect, (struct sockaddr *)&sin, len); sleep(1); sendfd(sv[0], slisten); close3(slisten, sv[0], sv[1]); sleep(1); close(sconnect); test_sysctls(inflight, openfiles); }
/* * Listen sockets can also be passed over UNIX domain sockets, so test * various cases, including ones where listen sockets have waiting sockets * hanging off them... */ static void listen_nothing(void) { struct sockaddr_un sun; struct sockaddr_in sin; int inflight, openfiles; int s; test = "listen_nothing_unp"; printf("%s\n", test); bzero(&sun, sizeof(sun)); sun.sun_family = AF_LOCAL; sun.sun_len = sizeof(sun); snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test); save_sysctls(&inflight, &openfiles); s = my_socket(PF_LOCAL, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sun, sizeof(sun)); my_listen(s, -1); close(s); (void)unlink(sun.sun_path); test_sysctls(inflight, openfiles); test = "listen_nothing_inet"; printf("%s\n", test); bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_len = sizeof(sin); sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(0); save_sysctls(&inflight, &openfiles); s = my_socket(PF_INET, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sin, sizeof(sin)); my_listen(s, -1); close(s); test_sysctls(inflight, openfiles); }
int main(int argc, char **argv) { int listenfd = 0; int connfd = 0; pid_t childpid ; socklen_t clilen; struct sockaddr_in cliaddr; struct sockaddr_in servaddr; listenfd = my_socket(AF_INET, SOCK_STREAM, 0); signal(SIGCHLD, tu5_11sig_chld); /// bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); my_bind(listenfd, (SA *)&servaddr, sizeof(servaddr)); my_listen(listenfd, LISTENQ); while(1) { clilen = sizeof(cliaddr); if ( (connfd = my_accept(listenfd, (SA*)&cliaddr, &clilen)) < 0) { } if ((childpid = my_fork()) == 0) { my_close(listenfd); tu5_17str_echo(connfd); exit(0); } my_close(connfd); } return 0; }
int main(int argc, const char *argv[]) { int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int n, i; pid_t pid; listenfd = my_socket(AF_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(SERV_PORT); my_bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); my_listen(listenfd, 20); printf("Accepting connections...\n"); while (1) { cliaddr_len = sizeof(cliaddr); connfd = my_accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); pid = fork(); if (pid == -1) { perror("call to fork"); exit(1); } else if (pid == 0) { my_close(listenfd); while (1) { n = my_read(connfd, buf, MAXLINE); if (n == 0) { printf("The other side has been closed.\n"); break; } printf("Received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); for (i = 0; i < n; i++) { buf[i] = toupper(buf[i]); } my_write(connfd, buf, n); } my_close(connfd); exit(0); } else { my_close(connfd); } } return 0; }
/* * Send a listen UDP socket over a UNIX domain socket. * * Send a listen TCP socket over a UNIX domain socket. * * Do each twice, with closing of the listen socket vs. socketpair in * different orders. */ static void listen_drop(void) { struct sockaddr_un sun; struct sockaddr_in sin; int inflight, openfiles; int s, sv[2]; bzero(&sun, sizeof(sun)); sun.sun_family = AF_LOCAL; sun.sun_len = sizeof(sun); /* * Close listen socket first. */ test = "listen_drop_unp1"; printf("%s\n", test); snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test); save_sysctls(&inflight, &openfiles); s = my_socket(PF_LOCAL, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sun, sizeof(sun)); my_listen(s, -1); my_socketpair(sv); sendfd(sv[0], s); close3(s, sv[0], sv[1]); test_sysctls(inflight, openfiles); /* * Close socketpair first. */ test = "listen_drop_unp2"; printf("%s\n", test); snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test); save_sysctls(&inflight, &openfiles); s = my_socket(PF_LOCAL, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sun, sizeof(sun)); my_listen(s, -1); my_socketpair(sv); sendfd(sv[0], s); close3(sv[0], sv[1], s); test_sysctls(inflight, openfiles); sin.sin_family = AF_INET; sin.sin_len = sizeof(sin); sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(0); /* * Close listen socket first. */ test = "listen_drop_inet1"; printf("%s\n", test); bzero(&sun, sizeof(sun)); save_sysctls(&inflight, &openfiles); s = my_socket(PF_INET, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sin, sizeof(sin)); my_listen(s, -1); my_socketpair(sv); sendfd(sv[0], s); close3(s, sv[0], sv[1]); test_sysctls(inflight, openfiles); /* * Close socketpair first. */ test = "listen_drop_inet2"; printf("%s\n", test); bzero(&sun, sizeof(sun)); save_sysctls(&inflight, &openfiles); s = my_socket(PF_INET, SOCK_STREAM, 0); my_bind(s, (struct sockaddr *)&sin, sizeof(sin)); my_listen(s, -1); my_socketpair(sv); sendfd(sv[0], s); close3(sv[0], sv[1], s); test_sysctls(inflight, openfiles); }
int main(int argc, const char *argv[]) { int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int n; pid_t pid; int filefd; listenfd = my_socket(AF_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(SERV_PORT); my_bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); my_listen(listenfd, 20); printf("Accepting connections...\n"); while (1) { cliaddr_len = sizeof(cliaddr); connfd = my_accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); pid = fork(); if (pid == -1) { perror("call to fork"); exit(1); } else if (pid == 0) { my_close(listenfd); n = my_read(connfd, buf, MAXLINE); filefd = open(buf, O_RDWR | O_CREAT | O_TRUNC, 0666); my_write(filefd, &buf[strlen(buf)+1], strlen(&buf[strlen(buf)+1])); while ((n = my_read(connfd, buf, MAXLINE))) { printf("Received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); if (filefd < 0) { perror("create file error"); exit(1); } //for (i = 0; i < n; i++) //{ //buf[i] = toupper(buf[i]); //} my_write(filefd, buf, n); } my_close(filefd); exit(0); } else { my_close(connfd); } } return 0; }