// 檢查 Winsock 版本號(hào),WSAData為WSADATA結(jié)構(gòu)對(duì)象
WSAStartup(MAKEWORD(2, 2), &WSAData);
// 創(chuàng)建原始套接字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW));
// 設(shè)置IP頭操作選項(xiàng),其中flag 設(shè)置為ture,親自對(duì)IP頭進(jìn)行處理
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
// 獲取本機(jī)名
gethostname((char*)LocalName, sizeof(LocalName)-1);
// 獲取本地 IP 地址
pHost = gethostbyname((char*)LocalName));
// 填充SOCKADDR_IN結(jié)構(gòu)
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
// 把原始套接字sock 綁定到本地網(wǎng)卡地址上
bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValue為輸入輸出參數(shù),為1時(shí)執(zhí)行,0時(shí)取消
DWORD dwValue = 1;
// 設(shè)置 SOCK_RAW 為SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定義為: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL, &dwValue);while (true)
{
// 接收原始數(shù)據(jù)包信息
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
if (ret >0)
{
// 對(duì)數(shù)據(jù)包進(jìn)行分析,并輸出分析結(jié)果
ip = *(IP*)RecvBuf;
tcp = *(TCP*)(RecvBuf + ip.HdrLen);
TRACE("協(xié)議: %s/r/n",GetProtocolTxt(ip.Protocol));
TRACE("IP源地址: %s/r/n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
TRACE("IP目標(biāo)地址: %s/r/n",inet_ntoa(*(in_addr*)&ip.DstAddr));
TRACE("TCP源端口號(hào): %d/r/n",tcp.SrcPort);
TRACE("TCP目標(biāo)端口號(hào):%d/r/n",tcp.DstPort);
TRACE("數(shù)據(jù)包長(zhǎng)度: %d/r/n/r/n/r/n",ntohs(ip.TotalLen));
}
} 其中,在進(jìn)行協(xié)議分析時(shí),使用了GetProtocolTxt()函數(shù),該函數(shù)負(fù)責(zé)將IP包中的協(xié)議(數(shù)字標(biāo)識(shí)的)轉(zhuǎn)化為文字輸出,該函數(shù)實(shí)現(xiàn)如下:#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_SPX_TXT "SPX"
#define PROTOCOL_STRING_NCP_TXT "NCP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"
……
CString CSnifferDlg::GetProtocolTxt(int Protocol)
{
switch (Protocol){
case IPPROTO_ICMP : //1 /* control message protocol */
return PROTOCOL_STRING_ICMP_TXT;
case IPPROTO_TCP : //6 /* tcp */
return PROTOCOL_STRING_TCP_TXT;
case IPPROTO_UDP : //17 /* user datagram protocol */
return PROTOCOL_STRING_UDP_TXT;
default:
return PROTOCOL_STRING_UNKNOW_TXT;
} 最后,為了使程序能成功編譯,需要包含頭文件winsock2.h和ws2tcpip.h。在本示例中將分析結(jié)果用TRACE()宏進(jìn)行輸出,在調(diào)試狀態(tài)下運(yùn)行,得到的一個(gè)分析結(jié)果如下:協(xié)議: UDP
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注