diff options
Diffstat (limited to 'listener.c')
-rw-r--r-- | listener.c | 50 |
1 files changed, 31 insertions, 19 deletions
@@ -13,9 +13,9 @@ #include <arpa/inet.h> #include <netdb.h> -#define MYPORT "4950" // the port users will be connecting to +// #define MYPORT "4950" // the port users will be connecting to -#define MAXBUFLEN 100 +#define MAXBUFLEN 16384 // get sockaddr, IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) @@ -27,7 +27,7 @@ void *get_in_addr(struct sockaddr *sa) return &(((struct sockaddr_in6*)sa)->sin6_addr); } -int main(void) +int main(int argc, char *argv[]) { int sockfd; struct addrinfo hints, *servinfo, *p; @@ -38,12 +38,20 @@ int main(void) socklen_t addr_len; char s[INET6_ADDRSTRLEN]; + if (argc != 2) { + fprintf(stderr,"<udp port>\n"); + exit(1); + } + + const char* udp_port = argv[1]; + + memset(&hints, 0, sizeof hints); - hints.ai_family = AF_INET6; // set to AF_INET to use IPv4 + hints.ai_family = AF_INET; // set to AF_INET to use IPv4 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; // use my IP - if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) { + if ((rv = getaddrinfo(NULL, udp_port, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } @@ -72,22 +80,26 @@ int main(void) freeaddrinfo(servinfo); - printf("listener: waiting to recvfrom...\n"); + int count = 0; - addr_len = sizeof their_addr; - if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, - (struct sockaddr *)&their_addr, &addr_len)) == -1) { - perror("recvfrom"); - exit(1); - } + while(1) { + printf("\nlistener: waiting to recvfrom... %d times\n", count++); - printf("listener: got packet from %s\n", - inet_ntop(their_addr.ss_family, - get_in_addr((struct sockaddr *)&their_addr), - s, sizeof s)); - printf("listener: packet is %d bytes long\n", numbytes); - buf[numbytes] = '\0'; - printf("listener: packet contains \"%s\"\n", buf); + addr_len = sizeof their_addr; + if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN , 0, + (struct sockaddr *)&their_addr, &addr_len)) == -1) { + perror("recvfrom"); + exit(1); + } + + printf("listener: got packet from %s\n", + inet_ntop(their_addr.ss_family, + get_in_addr((struct sockaddr *)&their_addr), + s, sizeof s)); + printf("listener: packet is %d bytes long\n", numbytes); + buf[numbytes] = '\0'; + printf("listener: packet contains \"%s\"\n", buf); + } close(sockfd); |