Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct sockaddr_in srvaddr;
- struct sockaddr_in cliaddr;
- struct msghdr msg;
- union control_data cmsg;
- struct iovec iov[1];
- char buf[1024];
- int sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (sock == -1) DLOG_PF("socket: %1",errno);
- int sockopt = 1;
- //if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)) == -1) DLOG_PF("setsockopt 1: %1", errno);
- if (setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &sockopt, sizeof(sockopt)) == -1) DLOG_PF("setsockopt 3: %1", errno);
- memset(&srvaddr, 0, sizeof srvaddr);
- srvaddr.sin_family = AF_INET;
- srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- srvaddr.sin_port = htons(MDK_CMD_UDP_PORT);
- if (bind(sock, (struct sockaddr *)&srvaddr, sizeof srvaddr) == -1) DLOG_PF("bind: %1", errno);
- iov[0].iov_base = buf;
- iov[0].iov_len = sizeof buf;
- memset(&msg, 0, sizeof msg);
- msg.msg_name = &cliaddr;
- msg.msg_namelen = sizeof cliaddr;
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_control = &cmsg;
- msg.msg_controllen = sizeof cmsg;
- for (;;)
- {
- ssize_t nbytes = recvmsg(sock, &msg, 0);
- if (nbytes == -1) { DLOG_PF("recvmsg: %1", errno); }
- for(cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg))
- {
- if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO)
- {
- in_pktinfo *pkt_info = (in_pktinfo*)CMSG_DATA(cmsg);
- DLOG_PF("recvmsg info: %1 %2 %3",
- pkt_info->ipi_addr.s_addr,
- pkt_info->ipi_spec_dst.s_addr,
- pkt_info->ipi_ifindex);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement