sendmsg如何从指定接口(网卡)发数据

爱碎碎念 2009-12-10 04:50:43
环境:linux

ssize_t sendmsg (int sockfd, struct msghdr *msg, int flags);

其中sockfd=socket(AF_INET6, SOCK_RAW, 88 );/* 88 是自己定义的 */

sendmsg可以带辅助数据,我使用的辅助数据类型cmsg_type = IPV6_PKTINFO

而struct in6_pktinfo中有ipi6_ifindex成员,我想使用它来接定发送的接口(即网卡).

可实际上发送的数据确从所有接口发送出去.也就是指定无效.

恳请达人给予解答.谢谢.

-------
在使用recvmsg函数接收数据并判断是从哪个接口接收到的数据时,也是使用这种辅助数据,刚开使未成功.

后来设置了选项setsockopt (sockfd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on));就可以了.

我怀疑是不是对于sendmsg也需要设置什么选项.

怕上面说的不清楚,代码也贴上来了.
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;
}
...全文
258 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱碎碎念 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shiweifu 的回复:]
帮顶了!
[/Quote]
谢谢!
shiweifu 2009-12-10
  • 打赏
  • 举报
回复
帮顶了!
爱碎碎念 2009-12-10
  • 打赏
  • 举报
回复
贴子沉了,顶一下下.

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧