linux网络编程:原始套接字编程及实例分析

linux网络编程:原始套接字编程及实例分析

ID:6716108

大小:604.36 KB

页数:8页

时间:2018-01-23

linux网络编程:原始套接字编程及实例分析_第1页
linux网络编程:原始套接字编程及实例分析_第2页
linux网络编程:原始套接字编程及实例分析_第3页
linux网络编程:原始套接字编程及实例分析_第4页
linux网络编程:原始套接字编程及实例分析_第5页
资源描述:

《linux网络编程:原始套接字编程及实例分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux网络编程:原始套接字编程及实例分析一、原始套接字能干什么?通常情况下程序员接所接触到的套接字(Socket)为两类:(1)流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的TCP服务应用;(2)数据报式套接字(SOCK_DGRAM):一种无连接的Socket,对应于无连接的UDP服务应用。从用户的角度来看,SOCK_STREAM、SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的全部,因为基于TCP/IP的应用,从协议栈的层次上讲,在传输层的确只可能建立于TCP或UDP协议之上,而SOCK_STREAM、SOCK_DGRAM又分别

2、对应于TCP和UDP,所以几乎所有的应用都可以用这两类套接字实现。  但是,当我们面对如下问题时,SOCK_STREAM、SOCK_DGRAM将显得这样无助:(1)怎样发送一个自定义的IP包?(2)怎样发送一个ICMP协议包?(3)怎样分析所有经过网络的包,而不管这样包是否是发给自己的?(4)怎样伪装本地的IP地址?这使得我们必须面对另外一个深刻的主题——原始套接字(SOCK_RAW)。原始套接字广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer(一种基于被动侦听原理的网络分析方式)、拒绝服务攻击(DOS)、IP欺骗等都可以通过原始套接字实现。原始套接字(SOCK

3、_RAW)可以用来自行组装数据包,可以接收本机网卡上所有的数据帧(数据包),对于监听网络流量和分析网络数据很有作用。原始套接字是基于IP数据包的编程(SOCK_PACKET是基于数据链路层的编程)。另外,必须在管理员权限下才能使用原始套接字。原始套接字(SOCK_RAW)与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于原始套接字直接置“根”于操作系统网络核心(NetworkCore),而SOCK_STREAM、SOCK_DGRAM则“悬浮”于TCP和UDP协议的外围。  流式套接字只能收发TCP协议的数据,数据报套接字只能收发UDP协议的数据,原始套接字可以收发内

4、核没有处理的数据包。二、原始套接字编程原始套接字编程和之前的UDP编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据。区别在于,原始套接字可以自行组装数据包(伪装本地IP,本地MAC),可以接收本机网卡上所有的数据帧(数据包)。另外,必须在管理员权限下才能使用原始套接字。原始套接字的创建:intsocket(intfamily,inttype,intprotocol);参数:family:协议族这里写PF_PACKETtype:套接字类,这里写SOCK_RAWprotocol:协议类别,指定可以接收或发送的数据包类型,不能写“0”,取值如下,注意,传参时需要用ht

5、ons()进行字节序转换。ETH_P_IP:IPV4数据包ETH_P_ARP:ARP数据包ETH_P_ALL:任何协议类型的数据包返回值:成功(>0):套接字,这里为链路层的套接字失败(<0):出错实例如下:// 所需头文件   #include    #include    #include   // perror      int main(int argc,charchar *argv[])   {       int sock_raw_fd = socket(PF_PACKET, SOCK_RAW,

6、 htons(ETH_P_ALL) );          if(sock_raw_fd < 0){           perror("socket");           return -1;       }              return 0;   }   获取链路层的数据包:ssize_trecvfrom(intsockfd,void*buf,size_tnbytes,intflags,structsockaddr*from,socklen_t*addrlen);参数:sockfd:原始套接字buf:接收数据缓冲区nbytes:接收数据缓冲区的大小flags:套接字标

7、志(常为0)from:这里没有用,写NULLaddrlen:这里没有用,写NULL返回值:成功:接收到的字符数失败:-1实例如下:#include    #include    #include    #include       int main(int argc,charchar *argv[])   {       unsigned

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。