test01.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "unp.h"
  2. int
  3. main(int argc, char **argv)
  4. {
  5. int sockfd, flag;
  6. ssize_t n;
  7. char buff[MAXLINE];
  8. const int on = 1;
  9. socklen_t addrlen, len;
  10. struct sockaddr *cliaddr;
  11. if (argc == 2)
  12. sockfd = Udp_server(NULL, argv[1], &addrlen);
  13. else if (argc == 3)
  14. sockfd = Udp_server(argv[1], argv[2], &addrlen);
  15. else
  16. err_quit("usage: test01 <hostname> <service>");
  17. cliaddr = Malloc(addrlen);
  18. #ifdef IP_RECVDSTADDR
  19. Setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on));
  20. len = sizeof(flag);
  21. Getsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &flag, &len);
  22. printf("IP_RECVDSTADDR option = %d, size = %d\n", flag, len);
  23. #else
  24. printf("IP_RECVDSTADDR not defined\n");
  25. #endif
  26. #ifdef IP_RECVIF
  27. Setsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on));
  28. len = sizeof(flag);
  29. Getsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &flag, &len);
  30. printf("IP_RECVIF option = %d, size = %d\n", flag, len);
  31. #else
  32. printf("IP_RECVIF not defined\n");
  33. #endif
  34. for ( ; ; ) {
  35. #define CONTROL_LEN (sizeof(struct cmsghdr) + sizeof(struct in_addr))
  36. char control[CONTROL_LEN];
  37. msg.msg_control = control;
  38. msg.msg_controllen = sizeof(control);
  39. msg.msg_flags = 0;
  40. #else
  41. bzero(&msg, sizeof(msg)); /* make certain msg_accrightslen = 0 */
  42. #endif
  43. msg.msg_name = sa;
  44. msg.msg_namelen = *salenptr;
  45. iov[0].iov_base = ptr;
  46. iov[0].iov_len = nbytes;
  47. msg.msg_iov = iov;
  48. msg.msg_iovlen = 1;
  49. if ( (n = recvmsg(fd, &msg, *flagsp)) < 0)
  50. return(n);
  51. len = addrlen;
  52. n = Recvfrom(sockfd, buff, MAXLINE, 0, cliaddr, &len);
  53. printf("datagram from %s\n", Sock_ntop(cliaddr, len));
  54. ticks = time(NULL);
  55. snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
  56. Sendto(sockfd, buff, strlen(buff), 0, cliaddr, len);
  57. }
  58. exit(0);
  59. }