链路层原始套接字编程-服务端
来源:互联网 发布:javascript实例书籍 编辑:程序博客网 时间:2024/06/01 22:39
#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/types.h> #include <sys/socket.h>#include <netpacket/packet.h>#include <net/if.h>#include <net/if_arp.h>#include <sys/ioctl.h>#define LEN 60void print_str16(unsigned char buf[], size_t len){ int i; unsigned char c; if(buf == NULL || len <= 0) return; for(i=0; i<len; i++){ c = buf[i]; printf("%02x", c); } printf("\n");}void print_sockaddr_ll(struct sockaddr_ll *sa){ if(sa == NULL) return; printf("sll_family:%d\n", sa->sll_family); printf("sll_protocol:%#x\n", ntohs(sa->sll_protocol)); printf("sll_ifindex:%#x\n", sa->sll_ifindex); printf("sll_hatype:%d\n", sa->sll_hatype); printf("sll_pkttype:%d\n", sa->sll_pkttype); printf("sll_halen:%d\n", sa->sll_halen); printf("sll_addr:"); print_str16(sa->sll_addr, sa->sll_halen);}int main(){ int result=0, fd, n, count=0; char buf[LEN]; struct sockaddr_ll sa, sa_recv; struct ifreq ifr; socklen_t sa_len=0; char if_name[]="eth1"; memset(&sa, 0, sizeof(sa)); sa.sll_family = PF_PACKET; sa.sll_protocol = htons(0x8902); //create socket fd = socket(PF_PACKET, SOCK_RAW, htons(0x8902)); if(fd < 0){ perror("socket error\n"); return errno; } // get flags strcpy(ifr.ifr_name, if_name); result = ioctl(fd, SIOCGIFFLAGS, &ifr); if(result != 0){ perror("ioctl error, get flags\n"); return errno; } ifr.ifr_flags |= IFF_PROMISC; // set promisc mode result = ioctl(fd, SIOCSIFFLAGS, &ifr); if(result != 0){ perror("ioctl error, set promisc\n"); return errno; } //get index result = ioctl(fd, SIOCGIFINDEX, &ifr); if(result != 0){ perror("ioctl error, get index\n"); return errno; } sa.sll_ifindex = ifr.ifr_ifindex; //bind fd result = bind(fd, (struct sockaddr*)&sa, sizeof(struct sockaddr_ll)); if(result != 0){ perror("bind error\n"); return errno; } //recvfrom while(1){ memset(buf, 0, sizeof(buf)); n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&sa_recv, &sa_len); if(n < 0){ printf("sendto error, %d\n", errno); return errno; } printf("******************* recvfrom msg %d ****************\n", ++count); print_str16(buf, n); print_sockaddr_ll(&sa_recv); printf("sa_len:%d\n", sa_len); } return 0;}
0 0
- 链路层原始套接字编程-服务端
- 原始套接字编程
- 链路层网络编程技术--原始套接字
- 链路层原始套接字编程-客户端
- 链路层原始套接字编程-总结
- 网络编程原始套接字
- 原始套接字编程示例
- 网络编程原始套接字
- 原始套接字编程接口
- 基于原始套接字编程
- 原始套接字编程(1)
- 【Linux网络编程】原始套接字编程
- linux原始套接字编程之收发链路层广播(收端)
- Linux网络编程:10. 原始套接字
- WinSocket编程——原始套接字
- 网络编程之-原始套接字
- Linux网络编程:原始套接字
- linux sock_raw原始套接字编程
- C++技术问题总结-第10篇 MFC中SendMessage与PostMessage异同
- ubuntu chkconfig undate-rc.d
- 实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient
- struts.xml配置详解
- 华为2014年7月机试题输入正整数根据字符映射表输出对应字符
- 链路层原始套接字编程-服务端
- Openstack Neutron Provider Network虚机数据流
- c++中输入输出流的格式控制符
- 关于生活
- 修改mysql的字符集和默认存储引擎
- QApplication 类
- js传递对象
- uv平板机需要我们注意的地方
- Ubuntu 系统 Update-rc.d 命令