免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3864 | 回复: 2
打印 上一主题 下一主题

[OpenBSD] openbsd 下 nc 源代码文件 netcat.c 简单分析,添加组地址数据接收功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-13 16:36 |只看该作者 |倒序浏览
本帖最后由 vity 于 2014-08-13 17:13 编辑

netcat.c 就 1100 多行,适合拿来练习。为了增加接收 D 类 IP 地址数据的功能,大致分析了一下 netcat.c 文件。

在 main 函数中,通过 getopt 获取命令参数,包括,本地ip和端口,目的地ip和端口。将所用到的网络协议写入 struct addrinfo hints 中,通过子函数 build_ports 将端口范围解析为端口字符串数组 portlist。

针对每一个 port,执行这些操作:执行 remote_connect() 函数,获得返回的 socket 后,执行 readwrite()。

在 remote_connect() 中,首先通过 getaddrinfo() 获得远端ip和端口,创建 socket,需要绑定本机ip和端口时setsockopt 设定一些参数并执行 bind,然后通过 set_common_sockopts() 设定一些普通参数,最后调用子函数 timeout_connect() 设置超时并执行 connect() ,让 socket 连接指定ip和端口。

timeout_connect() 中使用了 poll 技术,设置网络访问超时。在 readwrite() 中使用了 poll 技术,协调键盘输入与网络数据显示之间的关系。

源代码大致如此,需要增加组地址数据发送和接收功能,需要两个 socket。例如往 224.0.0.1 这个组地址中发送数据,和普通的 udp 数据发送一样,目的地ip和端口十分明确,但是如果要接收组地址数据,需要本机给路由器发送igmp协议数据,申请加入组地址,并且路由器将组地址数据转发给本机时,源端地址ip变为一个子网内的一个未知的ip地址了,可能是 192.168.1.225,造成数据发送目的地和远端ip不一致。因此组地址数据的接收和发送不能用一个 connect 函数解决。

要修改 netcat.c 源代码,就是将数据发送的功能不动,将组地址网络数据接收的 socket 加以改动。我在 readwrite()函数中,将 read 部分的 socket 修改为新的 socket,不使用原来已经 connect 的那个 socket。
因此在 readwrite() 子函数中,创建了一个新的 socket,绑定组地址端口和0.0.0.0的ip,利用 setsockopt 增加 IP_ADD_MEMBERSHIP 设置,将原来网络接口 pollin 的 socket 修改为新的 socket。

使用 tcpdump 可以看见 igmp 协议申请加入组地址,程序结束时 igmp 协议申请离开组地址。组地址数据收发正常。
nc 测试时,需要删除 224/4 路由项,执行:route delete 224/4。
nc 测试时,需要防火墙允许 ip 协议数据,即修改 pf 规则:添加 pass in quick on interface0 all allow-opts。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2014-08-13 20:17 |只看该作者
感谢lz分享。

论坛徽章:
29
技术图书徽章
日期:2013-09-02 19:59:502015元宵节徽章
日期:2015-03-06 15:51:332015小元宵徽章
日期:2015-03-06 15:57:20操作系统版块每日发帖之星
日期:2015-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17操作系统版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之水原三星
日期:2015-10-30 00:06:07数据库技术版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2016-01-07 10:32:07操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-05-18 06:20:00IT运维版块每日发帖之星
日期:2016-07-23 06:20:00
3 [报告]
发表于 2014-08-14 08:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP