/* ** broadcaster.c -- a datagram "client" like talker.c, except ** this one can broadcast */ #include #include #include #include #include #include #include #include #include #include #define SERVERPORT 15500 // the port users will be connecting to int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in their_addr; // connector's address information struct hostent *he; int numbytes; int broadcast = 1; //char broadcast = '1'; // if that doesn't work, try this if (argc != 4) { fprintf(stderr,"usage: broadcaster hostname port message\n"); fprintf(stderr,"hostname can be 255.255.255.255 for broadcast\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { // get the host info perror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } // this call is the difference between this program and talker.c: if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) == -1) { perror("setsockopt (SO_BROADCAST)"); exit(1); } their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons( atoi(argv[2]) ); // short, network byte order their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero); // forge string with newline int len = strlen(argv[3]); char *temp = (char*)calloc(len+2,sizeof(char)); snprintf(temp,len+2,"%s\n\n",argv[3]); if ((numbytes=sendto(sockfd, temp, len+2, 0, (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) { perror("sendto"); exit(1); } printf("sent %d bytes to %s\n", numbytes, inet_ntoa(their_addr.sin_addr)); close(sockfd); free(temp); return 0; }