socket_udp.c 716 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include "socket.h"
  7. #include "blocking.h"
  8. static void enable_bsd_fragmentation(int fd)
  9. {
  10. #ifdef IP_DONTFRAG
  11. const int x = 0;
  12. setsockopt(fd,SOL_IP,IP_DONTFRAG,&x,sizeof x);
  13. #endif
  14. }
  15. static void enable_linux_fragmentation(int fd)
  16. {
  17. #ifdef IP_MTU_DISCOVER
  18. #ifdef IP_PMTUDISC_DONT
  19. const int x = IP_PMTUDISC_DONT;
  20. setsockopt(fd,SOL_IP,IP_MTU_DISCOVER,&x,sizeof x);
  21. #endif
  22. #endif
  23. }
  24. int socket_udp(void)
  25. {
  26. int fd = socket(PF_INET,SOCK_DGRAM,0);
  27. if (fd == -1) return -1;
  28. fcntl(fd,F_SETFD,1);
  29. blocking_disable(fd);
  30. enable_bsd_fragmentation(fd);
  31. enable_linux_fragmentation(fd);
  32. return fd;
  33. }