Advertisement
Guest User

Untitled

a guest
Aug 14th, 2012
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. struct sockaddr_in srvaddr;
  2. struct sockaddr_in cliaddr;
  3. struct msghdr msg;
  4. union control_data cmsg;
  5. struct iovec iov[1];
  6. char buf[1024];
  7.  
  8. int sock = socket(AF_INET, SOCK_DGRAM, 0);
  9. if (sock == -1) DLOG_PF("socket: %1",errno);
  10. int sockopt = 1;
  11. //if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)) == -1) DLOG_PF("setsockopt 1: %1", errno);
  12. if (setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &sockopt, sizeof(sockopt)) == -1) DLOG_PF("setsockopt 3: %1", errno);
  13.  
  14. memset(&srvaddr, 0, sizeof srvaddr);
  15. srvaddr.sin_family = AF_INET;
  16. srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  17. srvaddr.sin_port = htons(MDK_CMD_UDP_PORT);
  18. if (bind(sock, (struct sockaddr *)&srvaddr, sizeof srvaddr) == -1) DLOG_PF("bind: %1", errno);
  19.  
  20. iov[0].iov_base = buf;
  21. iov[0].iov_len = sizeof buf;
  22. memset(&msg, 0, sizeof msg);
  23. msg.msg_name = &cliaddr;
  24. msg.msg_namelen = sizeof cliaddr;
  25. msg.msg_iov = iov;
  26. msg.msg_iovlen = 1;
  27. msg.msg_control = &cmsg;
  28. msg.msg_controllen = sizeof cmsg;
  29.  
  30. for (;;)
  31. {
  32. ssize_t nbytes = recvmsg(sock, &msg, 0);
  33. if (nbytes == -1) { DLOG_PF("recvmsg: %1", errno); }
  34.  
  35. for(cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg))
  36. {
  37. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO)
  38. {
  39. in_pktinfo *pkt_info = (in_pktinfo*)CMSG_DATA(cmsg);
  40. DLOG_PF("recvmsg info: %1 %2 %3",
  41. pkt_info->ipi_addr.s_addr,
  42. pkt_info->ipi_spec_dst.s_addr,
  43. pkt_info->ipi_ifindex);
  44. }
  45. }
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement