7 #include <sys/socket.h>
8 #include <netinet/in.h>
12 #include <atalk/fce_api.h>
16 // get sockaddr, IPv4 or IPv6:
17 void *get_in_addr(struct sockaddr *sa)
19 if (sa->sa_family == AF_INET) {
20 return &(((struct sockaddr_in*)sa)->sin_addr);
23 return &(((struct sockaddr_in6*)sa)->sin6_addr);
29 struct addrinfo hints, *servinfo, *p;
32 struct sockaddr_storage their_addr;
35 char s[INET6_ADDRSTRLEN];
37 memset(&hints, 0, sizeof hints);
38 hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
39 hints.ai_socktype = SOCK_DGRAM;
40 // hints.ai_flags = AI_PASSIVE; // use my IP
42 if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
43 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
47 // loop through all the results and bind to the first we can
48 for(p = servinfo; p != NULL; p = p->ai_next) {
49 if ((sockfd = socket(p->ai_family, p->ai_socktype,
50 p->ai_protocol)) == -1) {
51 perror("listener: socket");
55 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
57 perror("listener: bind");
65 fprintf(stderr, "listener: failed to bind socket\n");
69 freeaddrinfo(servinfo);
71 printf("listener: waiting to recvfrom...\n");
73 addr_len = sizeof their_addr;
74 if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
75 (struct sockaddr *)&their_addr, &addr_len)) == -1) {
80 printf("listener: got packet from %s\n",
81 inet_ntop(their_addr.ss_family,
82 get_in_addr((struct sockaddr *)&their_addr),
84 printf("listener: packet is %d bytes long\n", numbytes);
86 printf("listener: packet contains \"%s\"\n", buf);