/* socklib.c * * This module has all the socket stuff needed to get an * established connection. * * Basically the server side calls socket_declare() and * socket_accept(). * The client side calls socket_connect() */ #include #include #include #include #include #include #include #include #define TRUE 1 #define FALSE 0 static u_long squeeze_ip(); static int four_octets(); int socket_connect(char *hostname, int port) { struct sockaddr_in srvadr; struct hostent *hinfo; struct in_addr *haddr; char **address_list; int sockfd; memset(&srvadr, '\0', sizeof(srvadr)); srvadr.sin_family = AF_INET; if (four_octets(hostname)) srvadr.sin_addr.s_addr = squeeze_ip(hostname); else { hinfo = gethostbyname(hostname); if (hinfo == NULL) return (-1); address_list = hinfo->h_addr_list; haddr = (struct in_addr *) *address_list; srvadr.sin_addr.s_addr = haddr->s_addr; } srvadr.sin_port = htons(port); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return(-1); if (connect(sockfd, (struct sockaddr *) &srvadr, sizeof(srvadr)) == -1) { close(sockfd); return(-1); } return sockfd; } int socket_declare(int port) { struct sockaddr_in srvadr; int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) return(-1); memset(&srvadr, '\0', sizeof(srvadr)); srvadr.sin_family = AF_INET; srvadr.sin_addr.s_addr = htonl(INADDR_ANY); srvadr.sin_port = htons(port); if (bind(sockfd, (struct sockaddr *) &srvadr, sizeof(srvadr)) == -1) { close(sockfd); return(-1); } if (listen(sockfd, 0) == -1) { close(sockfd); return(-1); } return sockfd; } int socket_accept(int insockfd) { int clisockfd; int clilen; struct sockaddr_in cliadr; clilen = sizeof(cliadr); clisockfd = accept(insockfd, (struct sockaddr *) &cliadr, &clilen); return clisockfd; } static u_long squeeze_ip(char *ipstr) { int ip1, ip2, ip3, ip4; union { u_char ichar[4]; u_long ilong; } iunion; sscanf(ipstr, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); iunion.ichar[0] = ip1; iunion.ichar[1] = ip2; iunion.ichar[2] = ip3; iunion.ichar[3] = ip4; return(iunion.ilong); } static int four_octets(char *hname) { int ans = TRUE; int i; for (i = 0; i < strlen(hname); ++i) if ((hname[i] < '0' || hname[i] > '9') && hname[i] != '.') ans = FALSE; return(ans); }