?? socket.h.bak
字號:
/*
* Copyleft Abelworkshop.
* 文件名稱:socket.h
* 摘 要:sokcet應用輔助功能,完成一些處理工作
* 單 位:信息學院
* 作 者:羅濤,2120060434
* 完成日期:2006年11月20日
*/
#include "stdafx.h"
//#include <WINSOCK2.H>
//#include <WS2TCPIP.H>
//#include <stdlib.h>
//#include <stdio.h>
//#include <fstream>
//#include <windows.h>
using namespace std;
//#pragma comment(lib,"Ws2_32.lib")
#define ARP 0x0806
#define IP 0x00
#define ICMP 0x01
#define IGMP 0x02
#define IPinIP 0X04
#define TCP 0x06
#define EGP 0x08
#define UDP 0x11
#define IPv6 0x29
#define RSVP 0x2E
#define OSPF 0x59
#define BUFFER_SIZE 20
#define BUFFERSIZE 24
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#pragma comment(lib, "wsock32.lib")
typedef unsigned char uchar;
typedef unsigned short usint;
typedef unsigned long ulint;
#pragma pack(1) //進入字節對齊方式,方便后邊的類型強制轉換20061030
typedef struct FrameHeader_t { //幀首部
BYTE DesMAC[6]; // 目的地址
BYTE SrcMAC[6]; // 源地址
WORD FrameType; // 幀類型
} FrameHeader_t;
typedef struct IPHeader_t { //IP首部
BYTE Ver_HLen;
BYTE TOS;
WORD TotalLen;
WORD ID;
WORD Flag_Segment;
BYTE TTL;
BYTE Protocol;
WORD Checksum;
ULONG SrcIP;
ULONG DstIP;
} IPHeader_t;
typedef struct Data_t { //包含幀首部和IP首部的數據包
FrameHeader_t FrameHeader;
IPHeader_t IPHeader;
} Data_t;
#pragma pack() //恢復缺省對齊方式
//以上定義因為是眾所周知,所以在理解的基礎上自互聯網獲取20061030
/*根據以上定義提取源IP地址和目的IP地址的方法比較簡潔(如下),便比較浪費CPU操作時間
Data_t * IPPacket;
ULONG SourceIP,DestinationIP;
……
IPPacket = (Data_t *) pkt_data;
……
SourceIP = ntohl(IPPacket->IPHeader.SrcIP);
DestinationIP = ntohl(IPPacket->IPHeader.DstIP);
……*/
struct cap_pack //存放監控結果鏈表結點結構
{
ulint SrcIP; //源IP
ulint DstIP; //目的IP
BYTE Protocol; //協議類型
ulint Count; //統計數量
cap_pack* next; //鏈表,指向下一個節點
};
#define IPTOSBUFFERS 12
char* ipTostr(ulint ulIP){ // 將一個無符號長整型的機器IP地址轉換為字符串類型的用戶友好IP格式
static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
static short which; //定義兩個靜態數組,可容納最多12組IP類地址,最大程度防止指針越界!
uchar* chIP;
chIP = (uchar*)&ulIP; //取ulIP的地址,并強制轉化為無符號字符型指針
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
sprintf(output[which], "%d.%d.%d.%d", chIP[0], chIP[1], chIP[2], chIP[3]);
return output[which];
}
int countCh(char* chIn){ //計算字符數組長度
int i = 0;
while (chIn[i++] != 0);
return i;
}
ulint ulSeleIP = 0;
int threadHandle = 0;
int in_thread = 0;
int finish_msg = 1;
cap_pack* capHeader = NULL;
cap_pack* curPoint_R = NULL;
cap_pack* curPoint_T = NULL;
void addPackItem(ulint SrcIP, ulint DstIP, BYTE Protocol, char RorT){
cap_pack* p = capHeader; //capHeader.next=.SrcIP=.Count = 4277075694(0xfeeefeee),.Portocol = 238(0xee)
if (RorT) { //增加RorT標志,以識別接收還是發送,可以少N次比較20061106
if (curPoint_R) {
if (curPoint_R->SrcIP == SrcIP) {
if (curPoint_R->Protocol == Protocol) {
curPoint_R->Count++;
return;
}
}
}
while (p){
if (p->SrcIP == SrcIP) { //0xfeeefeee,CXX0030:Error:expression cannot be evaluated//SrcIP:192.168.0.254
//if (p->DstIP == DstIP){
if (p->Protocol == Protocol){
p->Count++;
curPoint_R = p; //保留最后一次操作指針,因為完全同一類型的包再次出現的機率比較大20061108
//AfxGetApp()->m_pMainWnd->MessageBox("modify one");
return;
}
//}
}
if (!p->next) break; //如果next為空則跳出,準備將新的結點賦于之20061103
p = p->next;
}
}
else{
if (curPoint_T) {
if (curPoint_T->DstIP == DstIP) {
if (curPoint_T->Protocol == Protocol) {
curPoint_T->Count++;
return;
}
}
}
while (p){
//if (p->SrcIP == SrcIP) {
if (p->DstIP == DstIP){
if (p->Protocol == Protocol){
p->Count++;
curPoint_T = p;
//AfxGetApp()->m_pMainWnd->MessageBox("modify one");
return;
}
}
//}
if (!p->next) break; //如果next為空則跳出,準備將新的結點賦于之20061103
p = p->next;
}
}
cap_pack* capItem = (cap_pack*)malloc(sizeof(cap_pack));
capItem->SrcIP = SrcIP;
capItem->DstIP = DstIP;
capItem->Protocol = Protocol;
capItem->Count = 1;
capItem->next = NULL;
if (capHeader) { //將鏈表接上20061103
p->next = capItem;
}
else {
capHeader = capItem; //初始化時此頭為空,此處第一次會同賦值20061103
}
if (RorT) { //在TCP連接中,一來一回會同時出現兩次變化,一個指針高速緩存反而成為累贅,所以調收與發兩個指針20061108
curPoint_R = capItem;
}
else {
curPoint_T = capItem;
}
//AfxGetApp()->m_pMainWnd->MessageBox("add one");
return;
}
void freePackItem(cap_pack* cHeader){ //將整個鏈表所占空間釋放
//AfxGetApp()->m_pMainWnd->MessageBox("free begin");
cap_pack* P = cHeader;
cap_pack* Pnext;
//AfxGetApp()->m_pMainWnd->MessageBox("free continue");
while (P){
Pnext = P->next;
free(P);
P = Pnext;
//AfxGetApp()->m_pMainWnd->MessageBox("free one");
}
capHeader = NULL; //將鏈表頭指針及傳入、傳出包高速緩沖指針置空20061108
curPoint_R = NULL;
curPoint_T = NULL;
//AfxGetApp()->m_pMainWnd->MessageBox("free all");
}
string proToCh(BYTE Protocol){ //將協議字段轉為字符串可讀
switch(Protocol) {
case IP:
return "IP ";
case ICMP:
return "ICMP ";
case IGMP:
return "IGMP ";
case IPinIP:
return "IPinIP";
case TCP:
return "TCP ";
case EGP:
return "EGP ";
case UDP:
return "UDP ";
case IPv6:
return "IPv6 ";
case RSVP:
return "RSVP ";
case OSPF:
return "OSPF ";
default:
return "UNKNOW";
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -