[LWIP学习]--原始套接字(SOCK_RAW)
来源:互联网 发布:双色球排列组合软件 编辑:程序博客网 时间:2024/06/06 23:52
通常情况下我们接触到的套接字为两类:
(1)字节流套接字(SOCK_STREAM):面向连接的socket套接字,用于TCP服务应用。
(2)数据包套接字(SOCK_DGRAM):无连接、不可靠的socket套接字,用于UDP服务应用。
从用户的角度来看,SOCK_STREAM、SOCK_DGRAM 这两类套接字似乎的确涵盖了 TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协议栈的层次上讲,在传输层的确只可能建立于 TCP 或 UDP 协议之上,而 SOCK_STREAM、SOCK_DGRAM 又分别对应于 TCP 和 UDP,所以几乎所有的应用都可以用这两类套接字实现。
但是,当我们面对如下问题时,SOCK_STREAM、SOCK_DGRAM 将显得这样无助:
(1)怎样发送一个自定义的 IP 包?
(2)怎样发送一个 ICMP 协议包?
(3)怎样分析所有经过网络的包,而不管这样包是否是发给自己的?
(4)怎样伪装本地的 IP 地址?
其实还有一类套接字,虽然不常被用到,但却可以实现上面几种功能–原始套接字(SOCK_RAW)
原始套接字广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer(一种基于被动侦听原理的网络分析方式)、拒绝服务攻击(DOS)、IP 欺骗等都可以通过原始套接字实现。
原始套接字(SOCK_RAW)可以用来自行组装数据包,我们常用的ping命令,其实现采用的就是原始套接字(SOCK_RAW)。
1.输入“ping www.baidu.com”命令后,在ping程序中会解析参数(IP地址、发送次数、发送数据大小、TTL值、timeout值)
2.创建原始套接字:socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
iSock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (iSock < 0) { return (PX_ERROR); } setsockopt(iSock, SOL_SOCKET, SO_RCVTIMEO, &iTimeout, sizeof(INT)); setsockopt(iSock, IPPROTO_IP, IP_TTL, &iTTL, sizeof(INT)); connect(iSock, (struct sockaddr *)&sockaddrinTo, sizeof(struct sockaddr_in));
3.构建ICMP报文,通过原始套接字类型直接发送数据包至IP层
icmphdrEcho = (struct icmp_echo_hdr *)__SHEAP_ALLOC(stPingSize); if (icmphdrEcho == LW_NULL) { return (PX_ERROR); } __inetPingPrepare(icmphdrEcho, iDataSize, pusSeqRecv); /* 构造 ping 包 */ sockaddrin.sin_len = sizeof(struct sockaddr_in); sockaddrin.sin_family = AF_INET; sockaddrin.sin_port = 0; sockaddrin.sin_addr = inaddr; sstError = sendto(iSock, icmphdrEcho, stPingSize, 0, (const struct sockaddr *)&sockaddrin, sizeof(struct sockaddr_in)); __SHEAP_FREE(icmphdrEcho);
这样,一个ping包就被发送出去了。
- [LWIP学习]--原始套接字(SOCK_RAW)
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字(SOCK_RAW)概述
- 原始套接字(SOCK_RAW)概述
- linux sock_raw原始套接字
- linux sock_raw原始套接字编程 (转!精!)
- linux sock_raw原始套接字编程 (转!)
- android 通过JNI 创建socket原始套接字(SOCK_RAW)
- linux sock_raw原始套接字编程
- linux sock_raw原始套接字编程
- 上传单个文件预览问题
- 注解方式的mybatis的使用
- Bitmap的基本使用
- java.util.zip.ZipException: ZIP file must have at least one entry
- 欢迎使用CSDN-markdown编辑器
- [LWIP学习]--原始套接字(SOCK_RAW)
- 【总结】深度学习打造精准推荐系统,细说国美互联网AI发展的进击之路
- RabbitMQ的Qos
- Jedis returnResource使用注意事项
- CNN网络加速--Performance Guaranteed Network Acceleration via High-Order Residual Quantization
- 用omnetpp仿真dsr协议
- 列表的两端对齐布局
- jsp概述
- AdroidStudio上传SVN忽略文件