/* dgtalker5.c -- a datagram sending skeleton */ #include #include #include #include #include #include #include #include #include #include #define MAXBUFLEN 2000 /* this macro can be used to check errors, see server.c for examples */ #define ERRORCHECK(var, value, command) if (var == value) { \ perror(command); \ exit(1); \ } int main(int argc, char *argv[]) { int sock; struct sockaddr_in remote_addr; /* connector's address information */ struct sockaddr_in own_addr; struct hostent *he; int nbytes; char buf[MAXBUFLEN]; int remoteport = 1; /* no default ports */ unsigned int sin_size = sizeof(struct sockaddr); int stat; if (argc != 4) { fprintf(stderr,"usage: %s hostname remoteport message\n", argv[0]); exit(1); } he=gethostbyname(argv[1]); /* get the host info */ ERRORCHECK(he, NULL, "gethostbyname"); remoteport = atoi(argv[2]); /* sanity check needed */ sock = socket(AF_INET, SOCK_DGRAM, 0); ERRORCHECK(sock, -1, "socket"); /* remote address struct */ remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(remoteport); remote_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(remote_addr.sin_zero), '\0', 8); /* local address struct */ own_addr.sin_family = AF_INET; own_addr.sin_port = htons(0); /* any port */ own_addr.sin_addr.s_addr = INADDR_ANY; memset(&(own_addr.sin_zero), '\0', 8); /* bind socket to local */ stat = bind(sock, (struct sockaddr *)&own_addr, sin_size); ERRORCHECK(stat, -1, "bind"); /* send packet */ nbytes=sendto(sock, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&remote_addr, sin_size); ERRORCHECK(nbytes, -1, "sendto"); printf("sent %d bytes to %s\n", nbytes, inet_ntoa(remote_addr.sin_addr)); /* receive reply */ /* this should time-out using select() in case of lost packet */ nbytes=recvfrom(sock, buf, MAXBUFLEN-1, 0, (struct sockaddr *)&remote_addr, &sin_size); ERRORCHECK(nbytes, -1, "recvfrom"); buf[nbytes] = '\0'; printf("received %d bytes :\n%s\n.\n", nbytes, buf); /* Pause here only to demonstrate usage of ports */ printf("Paused, press enter\n"); getchar(); /* wait */ close(sock); return 0; }