static int start_listening(void) { struct addrinfo hints, *res, *p; char port[10]; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; snprintf(port, sizeof(port), "%d", config.scgi_port); if (getaddrinfo(HOST, port, &hints, &res)) return -1; for (p = res; p; p = p->ai_next) { struct sockaddr_in *ipv4; struct sockaddr_in6 *ipv6; char str[64]; void *addr; int ret; switch (p->ai_family) { case AF_INET: ipv4 = (struct sockaddr_in *) p->ai_addr; addr = &ipv4->sin_addr; break; case AF_INET6: ipv6 = (struct sockaddr_in6 *) p->ai_addr; addr = &ipv6->sin6_addr; break; default: DBG("Unsupparted address family: %d", p->ai_family); addr = NULL; break; } if (!addr) continue; inet_ntop(p->ai_family, addr, str, sizeof(str)); ret = bind_sock(p->ai_family, p->ai_addr, p->ai_addrlen); if (ret && ret != -EAFNOSUPPORT) return ret; else if (!ret) cmn_err(CE_INFO, "Bound to: %s %s", str, port); } freeaddrinfo(res); return 0; }
int UDP_sock(in_port_t port){ int sock; struct sockaddr_in Local; sock = get_sock(SOCK_DGRAM); set_sock(sock); name_sock(&Local, htonl(INADDR_ANY), port); bind_sock(sock, &Local); printf("Socket UDP sulla porta %d creato\n", ntohs(port)); return sock; }
int TCP_sock_snd(in_addr_t ip, in_port_t port){ int sock; char ipstr[15]; struct sockaddr_in Local, To; inet_ntop(AF_INET, &ip, ipstr,(socklen_t)15); /* conversione a stringa dell'ip per stamparlo */ sock = get_sock(SOCK_STREAM); set_sock(sock); name_sock(&Local, htonl(INADDR_ANY), 0); bind_sock(sock, &Local); name_sock(&To, ip, port); connect_sock(sock, &To); printf ("Connessione TCP con %s avvenuta\n",ipstr); return sock; }
t_cli handle_pasv(t_env env, t_cli cli, char *str) { struct sockaddr_in6 sin; socklen_t len; char ip[16]; unsigned short port; (void)env; (void)str; port = 0; if (cli.istransferable) close(cli.env.data_fd); cli.env.data_fd = init_sock(cli.env); cli.env = bind_sock(cli.env, &cli.env.data_fd, &port); len = sizeof(sin); getsockname(cli.fd, (struct sockaddr*)&sin, &len); if (IN6_IS_ADDR_V4MAPPED(&sin.sin6_addr)) { ft_memcpy(ip, sin.sin6_addr.s6_addr + 12, 4); S_MESSAGE(227, cli.fd, (int)ip[0], (int)ip[1], (int)ip[2], (int)ip[3], (port >> 8) & 0xFF, port & 0xFF); cli.istransferable = TRUE; }
int TCP_sock_rcv(in_port_t port){ int sock, sock_rcv; int porta; struct sockaddr_in Local, From; char ipstr[15]; porta = ntohs(port); sock = get_sock(SOCK_STREAM); set_sock(sock); name_sock(&Local, htonl(INADDR_ANY), port); bind_sock(sock, &Local); listen_sock(sock); printf("Attendo una connessione TCP sulla porta %d\n\n", porta); sock_rcv = accept_sock(sock, &From); inet_ntop(AF_INET, &From.sin_addr, ipstr,(socklen_t)15); /* conversione a stringa dell'ip per stamparlo */ printf("Connessione TCP da %s : %d\n\n", ipstr, ntohs(From.sin_port)); return sock_rcv; }
int main(int argc, char *argv[]) { if (argc != 2) { printf("usage: ./server <#port>\n"); exit(EXIT_FAILURE); } int port = atoi(argv[1]); /* SIGCHLD handler */ struct sigaction sigchld; sigchld.sa_handler = chld_handler; sigemptyset(&sigchld.sa_mask); sigchld.sa_flags = 0; sigaction(SIGCHLD,&sigchld,NULL); int listenfd = bind_sock(port); listen_sock(listenfd); handle_connection(listenfd); return 0; }
/***************************************************************************** * Perform DNS lookup ****************************************************************************/ int socket::dnsLookup(const char *host, int port, int mode) { struct sockaddr *sa; struct addrinfo hints; struct addrinfo *res; int ret = 0; int err = 0; int sock = socket_val; size_t salen; char buf[128]; int socktype; socklen_t len = sizeof(socklen_t); #ifndef WIN32 struct sockaddr_un local; #endif /* WIN32 */ /* Unix domain sockets */ #ifndef WIN32 if (host[0] == '/') { properties["unix_socket"] = new boolean(true); local.sun_family = AF_UNIX; strcpy(local.sun_path, host); if (mode) { unlink(local.sun_path); ret = bind_sock(sock, (struct sockaddr*)&local, sizeof(local)); } else { ret = connect_sock(sock, (struct sockaddr*)&local, sizeof(local)); } } else { #endif properties["unix_socket"] = new boolean(false); /* AF_INET[6] */ memset(&hints, 0, sizeof(hints)); sprintf(buf, "%d", port); getsockopt(sock, SOL_SOCKET, SO_TYPE, (char*)&socktype, &len); /* set-up hints structure */ hints.ai_family = AF_UNSPEC; hints.ai_socktype = socktype; if (mode) hints.ai_flags = AI_PASSIVE; err = getaddrinfo(host, buf, &hints, &res); if (err) { if (res) freeaddrinfo(res); exceptions::DnsError *exc = exceptions::DnsError::Create( 1, new string((char*)gai_strerror(err)) ); exc->throw_exception(); } else { struct addrinfo *top = res; while (res) { sa = res->ai_addr; salen = res->ai_addrlen; if (mode) { /* bind() */ ret = bind_sock(sock, sa, salen); if (ret < 0) goto end_socket; } else { /* connect() */ ret = connect_sock(sock, sa, salen); if (ret == 0) goto end_socket; } res = res->ai_next; } end_socket: freeaddrinfo(top); } #ifndef WIN32 } #endif return ret; }