[問題] 網路通訊程式設計raw_socket 處理TCP連接

作者: yyan1218 (今天下雨了嗎)   2014-12-05 18:40:41
開發平台(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
=========================================================
小弟在此版第一次發文,如有違反版規或這文內容不適當,
還望各位大大鞭策提醒,我會盡快修正。
作者: pico2k (風月)   2014-12-05 19:25:00
不考慮用win32pcap嗎?,google "win32 libpcap"...
作者: yyan1218 (今天下雨了嗎)   2014-12-05 19:48:00
好 我查查看 謝謝關鍵字

Links booklink

Contact Us: admin [ a t ] ucptt.com