【LWIP】原始套接字(SOCK_RAW)

收录于:

【LWIP】LWIP协议|相关知识汇总|LWIP学习笔记


通常情况下我们接触到的套接字为两类:
  (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包就被发送出去了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan_ZGYF丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值