1: #include <stdio.h> 2: #include <sys/types.h> 3: #include <sys/socket.h> 4: #include <netinet/in.h> 5: #include <netdb.h> 6: #include <errno.h> 7: 8: #define FIRSTPORT 1425 9: #define LASTPORT 64000 10: 11: /* some useful definitions */ 12: #define TRUE 1 13: #define FALSE 0 14: #define bool char 15: #define HOSTNAMESIZE 32 16: 17: int errno; /* the magic global */ 18: char ourhostname[HOSTNAMESIZE]; /* local host name */ 19: long ourhostaddr; /* our host's address */ 20: bool havehost = FALSE; /* true if ourhost* is valid */ 21: 22: 23: /* get info about local host */ 24: getmyhoststuff() 25: { 26: char *temp; 27: 28: gethostname (ourhostname, HOSTNAMESIZE); 29: netaddr (ourhostname, &ourhostaddr); 30: havehost = TRUE; 31: } 32: 33: /* return our host's name */ 34: char * 35: myhostname() 36: { 37: if (!havehost) { 38: getmyhoststuff (); 39: } 40: return ourhostname; 41: } 42: 43: /* return our host's address */ 44: myhostaddr() 45: { 46: if (!havehost) { 47: getmyhoststuff (); 48: } 49: return ourhostaddr; 50: } 51: 52: 53: /* 54: * make a datagram socket 55: */ 56: makedgsocket (pptr) 57: int *pptr; /* port number */ 58: { 59: int sock, i, rv; 60: struct sockaddr_in sin; 61: 62: /* set up INET address */ 63: sin.sin_family = AF_INET; 64: sin.sin_addr.s_addr = myhostaddr(); 65: bzero (sin.sin_zero, 8); 66: 67: /* get a socket */ 68: sock = socket (AF_INET, SOCK_DGRAM, 0, 0); 69: if (sock < 0) { 70: error ("opening datagram socket"); 71: } 72: if (*pptr == 0) { 73: for (*pptr = FIRSTPORT; *pptr < LASTPORT; *pptr += 11) { 74: sin.sin_port = htons((u_short)*pptr); 75: rv = bind (sock, &sin, sizeof(sin), 0); 76: if (rv == 0) { 77: break; 78: } 79: } 80: } else { 81: sin.sin_port = htons((u_short)*pptr); 82: rv = bind (sock, &sin, sizeof(sin), 0); 83: } 84: if (rv != 0) { 85: close (sock); 86: error ("binding datagram socket"); 87: } 88: 89: return (sock); 90: } 91: 92: 93: /* get the network address of a machine */ 94: long 95: netaddr (name, addrptr) 96: char *name; 97: char *addrptr; 98: { 99: long iaddr; 100: struct hostent *hp, *gethostbyname(); 101: 102: hp = gethostbyname(name); 103: bcopy (hp->h_addr, addrptr, hp->h_length); 104: } 105: 106: /* are these two names synonymns? */ 107: aresynonyms (name1, name2) 108: char *name1, *name2; 109: { 110: struct hostent *hp, *gethostbyname(); 111: char **ptr; 112: 113: hp = gethostbyname(name1); 114: if (hp == 0) 115: return (FALSE); 116: if (strcmp (name2, hp->h_name) == 0) 117: return (TRUE); 118: for (ptr = hp->h_aliases; *ptr != 0; ptr++) { 119: if (strcmp (name2, *ptr) == 0) 120: return (TRUE); 121: } 122: return (FALSE); 123: } 124: 125: /* receive a datagram via the inet */ 126: recvdg (fd, buf, len) 127: int fd; /* socket to receive over */ 128: char * buf; /* buffer to receive into */ 129: int len; /* size in bytes of that buffer */ 130: { 131: struct sockaddr faddr; 132: int flen; 133: int rv, i; 134: 135: flen = sizeof (faddr); 136: rv = recvfrom (fd, buf, len, 0, &faddr, &flen); 137: 138: return (rv); 139: } 140: 141: /* send an inet datagram */ 142: senddg (fd, buf, len, destname, destport) 143: int fd; /* socket to send via */ 144: char *buf; /* buffer to send */ 145: int len; /* number of bytes to send */ 146: char *destname; /* name of host we're sending to */ 147: int destport; /* the udp port on that node */ 148: { 149: struct sockaddr_in sin; 150: int rv, i; 151: char *ptr; 152: 153: sin.sin_family = AF_INET; 154: bzero (sin.sin_zero, 8); 155: netaddr (destname, &(sin.sin_addr)); 156: sin.sin_port = htons ((u_short)destport); 157: rv = sendto (fd, buf, len, 0, &sin, sizeof(sin)); 158: return (rv); 159: }