summaryrefslogtreecommitdiff
path: root/src/broadcaster.c
diff options
context:
space:
mode:
authormiau <miaukatzemiau@priveasy.de>2011-12-01 14:13:35 (GMT)
committermiau <miaukatzemiau@priveasy.de>2011-12-01 14:13:35 (GMT)
commitb4b4c79cf6276e8d2cb851f4ea3d40102d11c5a4 (patch)
treea6d27d9602d0e9492bb69b9eb83a1dd08f0ab2b0 /src/broadcaster.c
parente99b31fcedd2e4b453b3023ea5cd8662fc335c9b (diff)
change to IPv6
Diffstat (limited to 'src/broadcaster.c')
-rw-r--r--src/broadcaster.c56
1 files changed, 18 insertions, 38 deletions
diff --git a/src/broadcaster.c b/src/broadcaster.c
index 9c02f79..c945b91 100644
--- a/src/broadcaster.c
+++ b/src/broadcaster.c
@@ -3,35 +3,22 @@
** this one can broadcast
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
#include "common.h"
-int main(int argc, char *argv[])
+int main(int argc, char **argv)
{
- int sockfd;
- struct sockaddr_in their_addr; // connector's address information
- struct hostent *he;
- int numbytes;
+ int fd;
+ struct sockaddr_in6 addr;
int broadcast = 1;
- // assemble packet
+ /* assemble packet, parse cmd line */
if (argc < 3 || argc > 4) {
- fprintf(stderr,"usage: broadcaster hostname task [message]\n");
- exit(1);
+ fprintf(stderr, "usage: %s interface task [message]\n", argv[0]);
+ exit(1);
}
char buf[MAXBUFLEN],
*task = argv[2],
- *message = (argc == 4) ? argv[3] : NULL;
+ *message = (argc == 4) ? argv[3] : "";
int task_len = strlen(task),
total_len = task_len + 1 + strlen(message);
if (total_len > MAXBUFLEN) {
@@ -42,30 +29,23 @@ int main(int argc, char *argv[])
buf[task_len] = 0;
strcpy(buf + 1 + task_len, message);
- if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
- perror("gethostbyname");
- exit(1);
- }
-
- if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ /* setup socket */
+ if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
- // this call is what allows broadcast packets to be sent:
- if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
- sizeof broadcast) == -1) {
- perror("setsockopt (SO_BROADCAST)");
- exit(1);
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = htons(SERVERPORT);
+ addr.sin6_flowinfo = 0;
+ inet_pton(AF_INET6, "ff02::1", &(addr.sin6_addr));
+ if ((addr.sin6_scope_id = if_nametoindex(argv[1])) == 0) {
+ fprintf(stderr, "interface not found\n");
+ exit(1);
}
- their_addr.sin_family = AF_INET; // host byte order
- their_addr.sin_port = htons(SERVERPORT); // 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);
-
- if ((numbytes=sendto(sockfd, buf, total_len, 0,
- (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
+ /* send packet */
+ if (sendto(fd, buf, total_len, 0, (struct sockaddr *)&addr, sizeof addr) == -1) {
perror("sendto");
exit(1);
}
contact: Jan Huwald // Impressum