IWBH_01

udp server sys?

Jul 3rd, 2021 (edited)
1,107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <WS2tcpip.h>
  3. #pragma comment (lib, "ws2_32.lib")
  4.  
  5.  
  6.  
  7. /*
  8. src:
  9. https://beej.us/guide/bgnet/html/
  10. ** listener.c -- a datagram sockets "server" demo
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <errno.h>
  17. #include <string.h>
  18. #include <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <netinet/in.h>
  21. #include <arpa/inet.h>
  22. #include <netdb.h>
  23.  
  24. #define MYPORT "4950"    // the port users will be connecting to
  25.  
  26. #define MAXBUFLEN 100
  27.  
  28. // get sockaddr, IPv4 or IPv6:
  29. void *get_in_addr(struct sockaddr *sa)
  30. {
  31.     if (sa->sa_family == AF_INET) {
  32.         return &(((struct sockaddr_in*)sa)->sin_addr);
  33.     }
  34.  
  35.     return &(((struct sockaddr_in6*)sa)->sin6_addr);
  36. }
  37.  
  38. int main(void)
  39. {
  40.     int sockfd;
  41.     struct addrinfo hints, *servinfo, *p;
  42.     int rv;
  43.     int numbytes;
  44.     struct sockaddr_storage their_addr;
  45.     char buf[MAXBUFLEN];
  46.     socklen_t addr_len;
  47.     char s[INET6_ADDRSTRLEN];
  48.  
  49.     memset(&hints, 0, sizeof hints);
  50.     hints.ai_family = AF_INET6; // set to AF_INET to use IPv4
  51.     hints.ai_socktype = SOCK_DGRAM;
  52.     hints.ai_flags = AI_PASSIVE; // use my IP
  53.  
  54.     if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) {
  55.         fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
  56.         return 1;
  57.     }
  58.  
  59.     // loop through all the results and bind to the first we can
  60.     for(p = servinfo; p != NULL; p = p->ai_next) {
  61.         if ((sockfd = socket(p->ai_family, p->ai_socktype,
  62.                 p->ai_protocol)) == -1) {
  63.             perror("listener: socket");
  64.             continue;
  65.         }
  66.  
  67.         if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
  68.             close(sockfd);
  69.             perror("listener: bind");
  70.             continue;
  71.         }
  72.  
  73.         break;
  74.     }
  75.  
  76.     if (p == NULL) {
  77.         fprintf(stderr, "listener: failed to bind socket\n");
  78.         return 2;
  79.     }
  80.  
  81.     freeaddrinfo(servinfo);
  82.  
  83.     printf("listener: waiting to recvfrom...\n");
  84.  
  85.     addr_len = sizeof their_addr;
  86.     if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
  87.         (struct sockaddr *)&their_addr, &addr_len)) == -1) {
  88.         perror("recvfrom");
  89.         exit(1);
  90.     }
  91.  
  92.     printf("listener: got packet from %s\n",
  93.         inet_ntop(their_addr.ss_family,
  94.             get_in_addr((struct sockaddr *)&their_addr),
  95.             s, sizeof s));
  96.     printf("listener: packet is %d bytes long\n", numbytes);
  97.     buf[numbytes] = '\0';
  98.     printf("listener: packet contains \"%s\"\n", buf);
  99.  
  100.     close(sockfd);
  101.  
  102.     return 0;
  103. }
Add Comment
Please, Sign In to add comment