int tcp_cli_nb(const char *host, const char *serv) { int sock; struct sockaddr_storage sas; int flags; struct sockaddr_in *sin = (struct sockaddr_in *)&sas; if ( net_resolv(host, serv, "tcp", &sas) < 0 ) return -1; if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) return -2; flags = fcntl(sock, F_GETFL); if ( flags < 0 ) return -3; flags |= O_NONBLOCK; if ( fcntl(sock, F_SETFL, flags) < 0 ) return -4; if ( connect(sock, (SA *)sin, sizeof(*sin)) < 0 ) { close(sock); return -5; } return sock; }
/* * This function is used to open a passive tcp socket. It uses hostname and * service to declare explicity which address and port to bind to if specified. * The length of the address is returned in addrlen if addrlen != 0; To wait * for a connection from here do an Accept()... */ int tcp_srv(const char *host, const char *serv) { int sock, set = 1; struct sockaddr_storage sas; struct sockaddr_in *sin = (struct sockaddr_in *)&sas; if ( net_resolv(host, serv, "tcp", &sas) < 0 ) return -1; /* now we have the address to use */ if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) return -2; if ( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set))<0 ) { close(sock); return -3; } if ( bind(sock, (SA *)sin, sizeof(*sin)) < 0 ) { close(sock); return -4; } if ( listen(sock, CAT_LISTENQ) < 0 ) { close(sock); return -5; } return sock; }
ssize_t udp_send (int socket, const char *ip_str, unsigned short int port, const void *buf, size_t len) { struct sockaddr_in toaddr; ssize_t sendret; if (ip_str == NULL || buf == NULL) { return -1; } memset (&toaddr, 0, sizeof (struct sockaddr_in)); if (net_resolv (ip_str, &toaddr.sin_addr)) { error (0, 0, _("Invalid IP address given: %s"), strerror (errno)); return -1; } toaddr.sin_family = AF_INET; toaddr.sin_port = htons (port); /* keep on sending and check for possible errors */ sendret = sendto (socket, buf, len, 0, (struct sockaddr *) &toaddr, sizeof (struct sockaddr_in)); return sendret == -1 ? sendret : 0; }
/* * This function opens a tcp connection to the address specified. It is * not protocol independant. You can start reading and writing * from here. */ int tcp_cli(const char *host, const char *serv) { int sock; struct sockaddr_storage sas; struct sockaddr_in *sin = (struct sockaddr_in *)&sas; if ( net_resolv(host, serv, "tcp", &sas) < 0 ) return -1; if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) return -2; if ( connect(sock, (SA *)sin, sizeof(*sin)) < 0 ) { close(sock); return -3; } return sock; }
/* * This opens a passive udp socket on the system. The hostname and service * will specifiy the address and port if given. */ int udp_sock(char *host, char *serv) { int sock, set = 1; struct sockaddr_storage sas; struct sockaddr_in *sin = (struct sockaddr_in *)&sas; if ( net_resolv(host, serv, "udp", &sas) < 0 ) return -1; if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) return -2; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set)) < 0) { close(sock); return -3; } if ( bind(sock, (SA *)sin, sizeof(*sin)) < 0 ) { close(sock); return -4; } return sock; }
int tcp_open (const char *ip_str, unsigned int port) { int sockfd; struct sockaddr_in toaddr; if (ip_str == NULL) { return -1; } memset (&toaddr, 0, sizeof (struct sockaddr_in)); if (net_resolv (ip_str, &toaddr.sin_addr)) { error (0, 0, _("Invalid IP address given: %s"), strerror (errno)); return -1; } toaddr.sin_family = AF_INET; toaddr.sin_port = htons (port); sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror ("socket() failed"); return -1; } if (connect (sockfd, (const struct sockaddr *) &toaddr, sizeof (toaddr))) { error (0, 0, _("Couldn't connect to %s:%hu: %s"), ip_str, port, strerror (errno)); close (sockfd); return -1; } return sockfd; }