设为首页 加入收藏

TOP

Linux网络编程——原始套接字编程
2015-07-16 12:57:46 来源: 作者: 【 】 浏览:59
Tags:Linux 网络编程 原始 套接字 编程

原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据。区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有的数据帧(数据包)。另外,必须在管理员权限下才能使用原始套接字。?


int socket ( int family, int type, int protocol );


参数
  family:协议族 这里写?PF_PACKET
  type: ?套接字类,这里写?SOCK_RAW
  protocol:协议类别,指定可以接收或发送的数据包类型,不能写 “0”,取值如下,注意,传参时需要用?htons() 进行字节序转换。


  ETH_P_IP:IPV4数据包
  ETH_P_ARP:ARP数据包
  ETH_P_ALL:任何协议类型的数据包


返回值
  成功( >0 ):套接字,这里为链路层的套接字
  失败( <0 ):出错?


实例如下:


获取链路层的数据包:


ssize_t recvfrom( int sockfd,
          void *buf,
          size_t nbytes,
          int flags,
          struct sockaddr *from,
          socklen_t *addrlen );


参数


  sockfd: 原始套接字
  buf: 接收数据缓冲区
  nbytes: 接收数据缓冲区的大小


  flags: 套接字标志(常为0)


  from: 这里没有用,写 NULL


  addrlen:这里没有用,写 NULL


返回值
  成功:接收到的字符数
  失败:-1


?


实例如下:


混杂模式


  默认的情况下,我们接收数据,目的地址是本地地址,才会接收。有时候我们想接收所有经过网卡的所有数据流,而不论其目的地址是否是它,这时候我们需要设置网卡为混杂模式


  网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在 Linux 操作系统中设置网卡混杂模式时需要管理员权限。在 Windows 操作系统和 Linux 操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件 Wireshark。


?


通过命令给 Linux?网卡设置混杂模式(需要管理员权限)


设置混杂模式:ifconfig eth0 promisc



取消混杂模式:ifconfig eth0 -promisc



?


?


通过代码给 Linux?网卡设置混杂模式



代码如下:


发送自定义的数据包:


ssize_t sendto( int sockfd,
        const void *buf,
        size_t nbytes,int flags,
        const struct sockaddr *to,
        socklen_t addrlen );


参数


  sockfd: 原始套接字
  buf: 发送数据缓冲区
  nbytes:?发送数据缓冲区的大小


  flags: 一般为 0
  to: 本机网络接口,指发送的数据应该从本机的哪个网卡出去,而不是以前的目的地址
  addrlen:to 所指向内容的长度


返回值
  成功:发送数据的字符数
  失败: -1?


本机网络接口的定义


?


发送完整代码如下:


这里头文件情况如下:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux网络编程——原始套接字能干.. 下一篇Linux网络编程——原始套接字实例..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: