无双 回复于:2003-07-19 23:02:19 |
raw_socket应该是只能接收到IP层的包
因为本机发出的包是走发送缓冲区 所以使用RAW——SOCKET不可以接收到 SNIFFER是监听 底层的广播包 可以得到数据库连路层包 所以在以太网中可以得到 |
蓝色键盘 回复于:2003-07-18 11:22:21 |
FAQ中有连接,也有代码。 |
grrrr120 回复于:2003-07-18 11:27:08 |
FAQ是什么地方
请斑竹写具体一点 |
蓝色键盘 回复于:2003-07-18 11:34:09 |
置顶FAQ
看见了吗?是汉字的写的标题 |
grrrr120 回复于:2003-07-18 12:01:12 |
大致看了一下
好像没有这方面的内容 其实我是想在没有转发功能的几个主机之间实现数据的转发 主机内部已经通过程序产生了路由表 |
蓝色键盘 回复于:2003-07-18 14:44:42 |
论坛中有的是代码,可以参考
对于RAW_socket接受来说: 1、对于tcp和udp报文分组,是不会传递给raw的。如果非要去读的话,考虑从数据链路层读取。 2、调用scoket函数的第三个参数是否置顶,并且和发送方一致。 3、发送者在connect你的过程中,指定的RAW是不是你的本地IP。 |
grrrr120 回复于:2003-07-18 15:11:43 |
那又怎么样读取底层(数据链路层)的报头呢? |
蓝色键盘 回复于:2003-07-18 15:20:46 |
看看snifer相关的东东。
网上这方面的代码和资料汗牛充栋。 |
mengwg 回复于:2003-07-20 09:25:08 |
[code:1:a84d0c650e]
#ifdef LINUX_SYS #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/utsname.h> #include <net/if.h> #include <netinet/in.h> #include <linux/if_ether.h> #include <netinet/if_ether.h> #include <netpacket/packet.h> #include <net/if.h> #include <netinet/in.h> int Linux_Cap_All_Ip(char * local_ip,int (* lookup_handle)(TNetProt * pnetprot)) { int sock_fd = -1; unsigned char buf[4096]; int bytes; struct sockaddr from; int id,toshownum,self_finded=0,find_self_num=0,find_self_str_len; socklen_t_type fromlen; int fcode; TNetProt send_pack; char self_src_ip[30],self_tag_ip[30]; int self_src_port,self_tag_port; struct ifreq ifr; struct packet_mreq mr; sock_fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)); if(sock_fd<0) return 0; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name,"eth0", sizeof(ifr.ifr_name)); if(ioctl(sock_fd, SIOCGIFFLAGS, &ifr)<0) { printf("iocetl get error\n"); return 0; }; ifr.ifr_flags |= IFF_PROMISC; if(ioctl(sock_fd, SIOCSIFFLAGS, &ifr)==-1) { printf("set promisc error"); return 0; } while(1) { bytes = recvfrom(sock_fd,buf,4096, MSG_TRUNC,(struct sockaddr *) &from, &fromlen); if(bytes<=0) continue; if(!send_pack.Unpack_Ip(buf,bytes)) continue; if(lookup_handle!=NULL) { if(!(*lookup_handle)(&send_pack)) break; continue; }; printf("srcip %15s tagip %15s ipprot %2d\n", send_pack.mPack.Ip_Src,send_pack.mPack.Ip_Tag,send_pack.mPack.Ip_Protocol); }; return 1; }; #endif [/code:1:a84d0c650e] |
无双 回复于:2003-07-20 10:19:38 |
可以用吧
那加精了 |
ohwww 回复于:2003-07-20 20:59:56 |
学习,最近刚想作个取所以可以检测到的网络数据包的程序,用c++builder做.希望这个可以用 |
mengwg 回复于:2003-07-20 21:00:58 |
[quote:978047deea="ohwww"]学习,最近刚想作个取所以可以检测到的网络数据包的程序,用c++builder做.希望这个可以用[/quote:978047deea]
用c++builder做.这个不能用,需要修改的 |
无双 回复于:2003-07-20 21:42:57 |
CB和VC使用socket前都是加WSAStarup吧
另外就是sniffer因为是与底层相关的 所以每个平台都会有区别 不像socket那样是有统一标准 |
ohwww 回复于:2003-07-21 12:03:04 |
哦,我今天看到一个软件winpcap,好像能协助来抓包,而且是所有的包,可是对这个东西不是很理解.大家可以找来用一下 |