int u_socket_listen_on_port(uint16_t portnum) { #if defined(PIPE_HAVE_SOCKETS) int s; struct sockaddr_in sa; memset(&sa, 0, sizeof(struct sockaddr_in)); sa.sin_family = AF_INET; sa.sin_port = htons(portnum); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s < 0) return -1; if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == -1) { u_socket_close(s); return -1; } listen(s, 0); return s; #else assert(0); return -1; #endif }
int u_socket_connect(const char *hostname, uint16_t port) { #if defined(PIPE_HAVE_SOCKETS) int s; struct sockaddr_in sa; struct hostent *host = NULL; memset(&sa, 0, sizeof(struct sockaddr_in)); host = gethostbyname(hostname); if (!host) return -1; memcpy((char *)&sa.sin_addr,host->h_addr_list[0],host->h_length); sa.sin_family= host->h_addrtype; sa.sin_port = htons(port); s = socket(host->h_addrtype, SOCK_STREAM, IPPROTO_TCP); if (s < 0) return -1; if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) { u_socket_close(s); return -1; } return s; #else assert(0); return -1; #endif }
int u_socket_connect(const char *hostname, uint16_t port) { #if defined(PIPE_HAVE_SOCKETS) int s, r; struct addrinfo hints, *addr; char portString[20]; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version hints.ai_socktype = SOCK_STREAM; util_snprintf(portString, sizeof(portString), "%d", port); r = getaddrinfo(hostname, portString, NULL, &addr); if (r != 0) { return -1; } s = socket(addr->ai_family, SOCK_STREAM, IPPROTO_TCP); if (s < 0) { freeaddrinfo(addr); return -1; } if (connect(s, addr->ai_addr, (int) addr->ai_addrlen)) { u_socket_close(s); freeaddrinfo(addr); return -1; } freeaddrinfo(addr); return s; #else assert(0); return -1; #endif }
/** * Free a connection, also closes socket. */ void rbug_disconnect(struct rbug_connection *c) { u_socket_close(c->socket); FREE(c); }