LinuxC网络编程笔记(三)

本文详细介绍了Linux环境下原始套接字编程的概念、应用场景,包括创建原始套接字、设置套接字选项、发送与接收报文的原理,以及报文头部结构。特别讨论了ICMP协议的重要性和其报文类型,还给出了使用原始套接字进行TCP协议的累加求和计算和IP地址转换的练习题目。
摘要由CSDN通过智能技术生成

原始套接字编程

原始套接字使一种非面向连接的,c/s传输方式的网络编程。使用原始套接字编程进行服务器端与客户端的通信前,都要创建各自的套接字,然后对应的套接字进行数据传输。在数据传输过程中,需要使用sendto()函数和recvfrom()函数进行发送与接收,再发送与接收函数中设置相应的IP地址。

原始套接字往往应用于高级网络编程,例如网络嗅探器sniffer、拒绝服务攻击DoS、IP欺骗等。并且还可以通过原始套接字来模拟IP的一些实用工具,例如PING命令。

创建函数

原始套接字编程是SOCK_RAW类型的套接字

int sockfd;
sockfd=socket(AF_INET,SOCK_RAW,protocol);

 protocol通常设置为0,还有下面4种取值

  • IPPROTO_IP
  • IPRROTO_ICMP
  • IPRROTO_TCP
  • IPRROTO_UDP

注:在Linux中,为了保护网络系统的安全,规定只有超级用户才能创建原始套接口的权限。

设置套接字选项

setsockopt()函数主要用于实现套接字相关的选项设置当前值。

#include<sys/types.h>
#include<sys/socket.h>
int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);

s:套接字描述符

level:选择定义的层次,如IPPROTO_IP

optname:套接字选项的名称,如IP_HDRINCL表示要构建IP头部

optval:指向存放选项数据的缓冲区的指针

optlen:缓冲区的长度

调用成功返回0;失败返回-1并设置相应的错误信息。

原始套接字的发送与接收

  • 发送报文的原则
  1. 通常,可以使用sendto()函数指定发送的目的地址,对数据进行传送。但如果已经调用bind()函数绑定了目标地址,则可以使用write()函数或者send()函数发送数据。
  2. 如果使用了setsockopt()设置了IP_RINCL,则发送的数据缓冲区指向IP头部第一个字节的头部,用户发送的数据包含IP头部之后的所有数据,需要用户自己填写IP头部和计算校验和及所包含数据的处理和计算
  3. 如果没有设置IP_RINCL,则发送缓冲区指向IP头部后面数据区域的第一个字节,不需要用户填写IP头部,IP头部的填写由内核完成,并由内核进行校验和计算。
  • 接收报文的特点
  1. 对于ICMP协议,绝大部分数据都可以通过原始套接字获得(回显请求,相应,时间戳请求等)
  2. 接收的UDP和TCP协议的数据不会传给任何原始套接字接口,这些协议的数据需要通过数据链路层获得
  3. 如果IP以分片形式到达,则所有分片都已经接收到并重组后才传给原始套接字
  4. 内核不能识别的协议&
linux C语言 网络编程教程及源码 一、网络应用层编程 1、Linux网络编程01——网络协议入门 2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络编程07——广播 8、Linux网络编程08——多播 9、Linux网络编程09——TCP编程之客户端 10、Linux网络编程10——TCP编程之服务器 11、Linux网络编程11——tcp、udp迭代服务器 12、Linux网络编程12——tcp次握手、四次挥手 13、Linux网络编程13——connect()、listen()和accept()者之间的关系 14、Linux网络编程14——I/O复用之select详解 15、Linux网络编程15——I/O复用之poll详解 16、Linux网络编程16——I/O复用之epoll详解 17、Linux网络编程17——tcp并发服务器(多进程) 18、Linux网络编程18——tcp并发服务器(多线程) 19、Linux网络编程——tcp高效并发服务器(select实现) 20、Linux网络编程——tcp高效并发服务器(poll实现) 21、Linux网络编程——tcp高效并发服务器(epoll实现) 二、网络底层编程(黑客模式) 1、Linux网络编程1——啥叫原始套接字 2、Linux网络编程2——原始套接字编程 3、Linux网络编程3——原始套接字实例:MAC头分析 4、Linux网络编程4——原始套接字实例:MAC地址扫描器 5、Linux网络编程5——IP数据报格式详解 6、Linux网络编程6——TCP、UDP数据包格式详解 7、Linux网络编程7——原始套接字实例:发送UDP数据包 8、Linux网络编程8——libpcap详解 9、Linux网络编程9——libnet详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值