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); } } }