开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 、 window 7 或是 XP SP2 以上的版本
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
winsock 函式库
问题(Question):
A程式用raw_socket写一个network sniffer,绑定(bind) 127.0.0.2 IP,
开启B程式做TCP连线,连线127.0.0.2 port:随意,但在connect会发生直接断线,
我的A程式有收到SYN封包 ,准备发SYN/ACK回去时,B程式老早就把socket跟关闭了,
上网爬闻有人说是B程式用connect的函式,内核会对应是否存在相对应的socket,
没对应到会直接发RST封包给B,官网则表示 win7 跟以上的版本,不能用raw_socket
做TCP连线。
================================================
问题重点:
1.因为要侦测所有的 port 所以我必须使用raw_socket
2.有没有方法直接阻断内核发出的RST封包,以避免B程式关闭socket?
3.虽然官网已经表示近代的OS,不能用raw_socket以免影响网络安全,
但是我这程式主要是用在 localhost,有没有什么方法可以越过这个限制?
================================================
事件顺序:
1.B程式开启sniffer 针对127.0.0.2 的所有封包
2.A程式对127.0.0.2 任意port进行连线
3.(时间很近)
B程式sniffer TCP 的SYN封包,准备发SYN/ACK封包回去
A程式因没有相对应的Socket,而关闭连线。
4.TCP连线失败。
======================================================
部分关键code:
SOCKET sniffer = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
dest.sin_family = AF_INET;
dest.sin_port = 0;
dest.sin_addr.s_addr=inet_addr("127.0.0.2");
bind(sniffer,(struct sockaddr *)&dest,sizeof(dest));
WSAIoctl(sniffer, SIO_RCVALL, &j, sizeof(j), 0, 0, (LPDWORD) &in , 0 , 0);
char Buffer[65536];
int mangobyte;
mangobyte = recvfrom(sniffer , Buffer , 65536 , 0 , 0 , 0);
.
.
.
.
//Buffer就是封包内容 ,过滤IP 标头里的 dest_ip (基本上一定是127.0.0.2)
//就可以看到TCP标头是不是SYN封包。是的话就准备回SYN/ACK
=========================================================
小弟在此版第一次发文,如有违反版规或这文内容不适当,
还望各位大大鞭策提醒,我会尽快修正。