how to correctly distinguish broadcast udp packets vs unicast
(socket, pcap or bpf)?
Budnev Vladimir
vladimir.budnev at gmail.com
Fri Jul 6 11:53:34 UTC 2012
Tnx!
Worked like a charm, with skipped init and other checks, just the
control point parts:
<...>
int optval=1;
setsockopt(root_socket, IPPROTO_IP, IP_RECVDSTADDR,
&optval, sizeof(optval))
<...>
char t[200];
unsigned int sender_len;
struct msghdr msg;
struct iovec iov;
struct sockaddr_in from;
sender_len = sizeof(from);
msg.msg_name = &from;
msg.msg_namelen = sender_len;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_iov->iov_base = &u;
msg.msg_iov->iov_len = sizeof(packet_container);
msg.msg_control = t;
msg.msg_controllen = sizeof(t);
msg.msg_flags = 0;
<...>
result = recvmsg(root_socket,&msg,0);
<...>
struct cmsghdr *cmsg=NULL;
uint32_t* dst_ip=NULL;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg =
CMSG_NXTHDR(&msg,cmsg)) {
if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type
== IP_RECVDSTADDR) {
dst_ip=(uint32_t*)CMSG_DATA(cmsg);
break;
}
}
<...>
And at that point we have destination ip in dst_ip var:)
More information about the freebsd-questions
mailing list