udp_server_reuseaddr.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* include udp_server */
  2. #include "unp.h"
  3. int
  4. udp_server_reuseaddr(const char *host, const char *serv, socklen_t *addrlenp)
  5. {
  6. int sockfd, n;
  7. const int on = 1;
  8. struct addrinfo hints, *res, *ressave;
  9. bzero(&hints, sizeof(struct addrinfo));
  10. hints.ai_flags = AI_PASSIVE;
  11. hints.ai_family = AF_UNSPEC;
  12. hints.ai_socktype = SOCK_DGRAM;
  13. if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)
  14. err_quit("udp_server error for %s, %s: %s",
  15. host, serv, gai_strerror(n));
  16. ressave = res;
  17. do {
  18. sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  19. if (sockfd < 0)
  20. continue; /* error, try next one */
  21. Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
  22. if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)
  23. break; /* success */
  24. Close(sockfd); /* bind error, close and try next one */
  25. } while ( (res = res->ai_next) != NULL);
  26. if (res == NULL) /* errno from final socket() or bind() */
  27. err_sys("udp_server error for %s, %s", host, serv);
  28. if (addrlenp)
  29. *addrlenp = res->ai_addrlen; /* return size of protocol address */
  30. freeaddrinfo(ressave);
  31. return(sockfd);
  32. }
  33. /* end udp_server */
  34. int
  35. Udp_server_reuseaddr(const char *host, const char *serv, socklen_t *addrlenp)
  36. {
  37. return(udp_server_reuseaddr(host, serv, addrlenp));
  38. }