在IPv4情况下,我会看到sendmsg的以下行为:
假设10.1.2.3是客户端IP。 10.1.2.10在客户端的其中一个接口上configuration。
在UDP消息中,以下控制信息被添加到分组中:
它只是服务器在回复客户端时使用的源地址或接口地址:
linux C ++:访问networking统计信息
僵尸进程不能被杀死
如何把2个部分放在1段(使用ld脚本)
系统调用号码和系统调用处理程序指针之间的冲突
在Ubuntu中安装八度包
CMSg->CMSg_len = sizeof(struct CMSghdr) + sizeof(sa->sin_addr); CMSg->CMSg_level = IPPROTO_IP; CMSg->CMSg_type = IP_SENDSRCADDR_WITH_ERROR; * (struct in_addr *)CMSG_DATA(CMSg) = sa->sin_addr; CMSg = (struct CMSghdr *)((caddr_t) CMSg + AliGN(CMSg->CMSg_len));
消息发送如下:
sendmsg(fd,send_msg,0);
如果我configuration10.1.2.10作为源IP,一旦它被添加到CMSG,事情工作正常。 服务器回复到10.1.2.10。
但是,如果我在客户端的任何接口上configuration了一些不可达IP地址或IP,sendmsg将失败,并显示以下错误:
sendmsg到10.1.2.3(10.1.2.3).1813失败:无法分配请求的地址
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
但是我没有看到与IPv6相同的行为:
假设2001 :: 1是客户端IP。 2001 :: 2001在客户端的其中一个接口上进行configuration。
IPv6源地址添加到控制消息如下:
CMSg->CMSg_level = IPPROTO_IPV6; CMSg->CMSg_type = IPV6_PKTINFO; CMSg->CMSg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); memcpy((struct in6_addr *)CMSG_DATA(CMSg),&(sa6->sin6_addr),sizeof(sa6->sin6_addr)); CMSg = (struct CMSghdr *)((caddr_t) CMSg + AliGN(CMSg->CMSg_len));
它工作正常,如果我configuration2001 :: 2001作为源IP,服务器确实回复到这个地址。
但是,如果我configuration了一个不可达的IPv6源地址,例如1001 :: 1001,sendmsg没有类似于我们在IPv4中看到的错误消息。 消息仍然以2001 :: 1的原始IPv6发送。
有人可以build议什么可以是问题?
谢谢。
系统()后获取子PID
处理2个cron任务之间的“竞争条件”。 什么是最好的方法?
从windows执行远程.sh文件
用于基准和时间戳计数器频率的rdtsc的准确度
Bash,删除空的XML标签
IP_SENDSRCADDR和IPV6_PKTINFO必须是两个不同的实现。 也许在第一种情况下,它只是控制错误。 您是否尝试在IPV6_PKTINFO的辅助数据中设置接口索引? 对于IPV6_PKTINFO,辅助数据的类型是:in6_pktinfo。
struct in6_pktinfo { struct in6_addr ipi6_addr; /* src/dst IPv6 address */ unsigned int ipi6_ifindex; /* send/recv if index */ };
希望这有助于某种方式
总结以上是内存溢出为你收集整理的sendmsg系统调用是否validation添加到辅助数据中的IPv6源地址?全部内容,希望文章能够帮你解决sendmsg系统调用是否validation添加到辅助数据中的IPv6源地址?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)