基於VC6 0的抓取TCP IP資料報的C 實現

2021-06-09 03:17:47 字數 2960 閱讀 2709

#include #include #include #pragma comment(lib,"ws2_32.lib")

#include using namespace std;

//ip首部

typedef struct tippackhead

; inline unsigned headlen() const

inline unsigned packlen() const

byte ver_hlen; //ip協議版本和ip首部長度。高4位為版本,低4位為首部的長度(單位為4bytes)

byte bytos; //服務型別

word wpacketlen; //ip包總長度。包括首部,單位為byte。[big endian]

word wsequence; //序號,一般每個ip包的序號遞增。[big endian]

word wmarkfragpoi;

byte byttl; //生存時間

byte byprotocoltype; //協議型別,見protocol_type定義

word wheadchecksum; //ip首部校驗和[big endian]

dword dwipsrc; //源位址

dword dwipdes; //目的位址

} ip_pk_head;

int decodeip(char *buf, int len);

int decodeip(char *buf, int len)

return 0;

}void autowsacleanup()

int main()

atexit( autowsacleanup );

//建立socket

socket h = socket( af_inet, sock_raw, ipproto_ip);

if( h == invalid_socket )

//獲取本機位址

char far name[128];

if( -1 == gethostname(name, sizeof(name)) )

struct hostent far * phostent;

phostent = gethostbyname(name);

//繫結本地位址到socket控制代碼

sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_addr = *(in_addr*)phostent->h_addr; //ip

addr.sin_port = 0; //埠,ip層埠可隨意填

if( socket_error == bind( h,(sockaddr *)&addr,sizeof(addr) ) )

//設定該socket為接收所有流經繫結的ip的網絡卡的所有資料,包括接收和傳送的資料報

//該函式在mstcpip.h裡面,詳見msdn幫助

u_long sioarg = 1;

dword wt=0;

if( socket_error == wsaioctl( h, sio_rcvall , &sioarg,sizeof(sioarg),null,0,&wt,null,null ) )

//我們只需要接收資料,因此設定為阻塞io,使用最簡單的io模型

u_long bioarg = 0;

if( socket_error == ioctlsocket( h, fionbio , &bioarg ) )

//開始接收資料

//因為前面已經設定為阻塞io,recv在接收到資料前不會返回。

//當返回<=0時表示接收失敗,退出迴圈

//可以在另乙個執行緒執行此迴圈,主線程closesocket可以使recv失敗而結束迴圈

char buf[102400];

int len = 0;

do}while( len > 0 );

closesocket( h );

return 0;

}

漢化版的vc貌似都沒有mstcpip.h檔案

內容如下,將內容儲存為mstcpip.h

然後放到microsoft visual studio\vc98\include這個資料夾下面即可

/* argument structure for sio_keepalive_vals */

struct tcp_keepalive ;

// new wsaioctl options

#define sio_rcvall            _wsaiow(ioc_vendor,1)

#define sio_rcvall_mcast      _wsaiow(ioc_vendor,2)

#define sio_rcvall_igmpmcast _wsaiow(ioc_vendor,3)

#define sio_keepalive_vals    _wsaiow(ioc_vendor,4)

#define sio_absorb_rtralert   _wsaiow(ioc_vendor,5)

#define sio_ucast_if          _wsaiow(ioc_vendor,6)

#define sio_limit_broadcasts _wsaiow(ioc_vendor,7)

#define sio_index_bind        _wsaiow(ioc_vendor,8)

#define sio_index_mcastif     _wsaiow(ioc_vendor,9)

#define sio_index_add_mcast   _wsaiow(ioc_vendor,10)

#define sio_index_del_mcast   _wsaiow(ioc_vendor,11)

VC6 0 製作的《數獨》遊戲發布!!!!

哈哈 第二款遊戲終於完成啦 這次的是兔斯基主題的數獨 呵呵 偶覺得很配啊 首先介紹下數獨的規則 如果你會玩數獨就跳過這一段吧 規則太簡單了,在空白位置填上數字1 9,但必須滿足 1.每一行都包括數字1 9 2.每一列都包括數字1 9 3.每乙個小的九宮格都包括陣列1 9 廢話少說了,馬上上圖。遊戲主...

VC6 0迴圈的彙編

今天突然來了興趣,想看看彙編級的迴圈.include using namespace std int main 1 include 2 using namespace std 3 4 int main 5 00401290 jmp main 28h 00401278 11 12 00401292 p...

VC6 0存在的問題

問題1public cstring file add2 0 初始化為零後,在成員變數中消失,從而出錯 儲存路徑 cstring fileadd 儲存 iplimage first image null 初始化為零後,在成員變數中消失,從而出錯 iplimage first image 原因,在.h檔...