69,370
社区成员
发帖
与我相关
我的任务
分享
int cn_send (struct in6_addr *src, struct in6_addr *dst,
struct cn_interface *ci, struct cn_header *ch)
{
struct sockaddr_in6 sa6_dst;
memset (&sa6_dst, 0, sizeof (sa6_dst));
sa6_dst.sin6_family = AF_INET6;
memcpy (&sa6_dst.sin6_addr, dst, sizeof (struct in6_addr));
u_char cmsgbuf[CMSG_SPACE(sizeof (struct in6_pktinfo))];
struct cmsghdr *scmsgp;
scmsgp = (struct cmsghdr *)cmsgbuf;
struct in6_pktinfo *pktinfo;
pktinfo = (struct in6_pktinfo *)(CMSG_DATA(scmsgp));
scmsgp->cmsg_len = CMSG_LEN (sizeof (struct in6_pktinfo));
scmsgp->cmsg_level = IPPROTO_IPV6;
scmsgp->cmsg_type = IPV6_PKTINFO;
memset (&pktinfo->ipi6_addr, 0, sizeof (struct in6_addr));
pktinfo->ipi6_ifindex = ci->ifindex;
struct iovec iov;
iov.iov_base = (void *)ch;
iov.iov_len = ntohs (ch->length);
struct msghdr smsghdr;
memset (&smsghdr, 0, sizeof (struct msghdr));
smsghdr.msg_name = (void *)&sa6_dst;
smsghdr.msg_namelen = sizeof (struct sockaddr_in6);
smsghdr.msg_iov = &iov;
smsghdr.msg_iovlen = 1;
smsghdr.msg_control = NULL;
smsghdr.msg_controllen = 0;
smsghdr.msg_flags = 0;
int n;
if ((n = sendmsg (sockfd, &smsghdr, 0)) < 0)
{
perror("sendmsg");
return -1;
}
.........
return 0;
}