最近參考http://study.viphot.com/InfoView/Article_2611.html然後自己也依樣寫了一個sniffer ... 可是不知道為什麼程式好像到了recv()這函數就有問題!! 就是在產生/設定socket, 程式跑到recv()好像就會停住, 好像也沒蘭到任何封包?? 所以想請大家幫忙看看是不是少了或是做錯什麼地方 ... 程式碼如下! Unit1.cpp
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include
#include
#include
#include #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WSADATA WSAData;
BOOL Opt = true;
char LocalName[25];
struct hostent *Host; if(WSAStartup(MAKEWORD(2, 2), &WSAData))
throw Exception("WSAStartup error!"); Sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(!Sock)
throw Exception("socket setup error!"); if(setsockopt(Sock, IPPROTO_IP, IP_HDRINCL, (char*)&Opt, sizeof(Opt)))
throw Exception("setsockopt IP_HDRINCL error!"); if(gethostname(LocalName, sizeof(LocalName)))
throw Exception("gethostname error!"); Host = gethostbyname(LocalName);
if(!Host)
throw Exception("gethostbyname error!"); Target.sin_family = AF_INET;
Target.sin_port = htons(57274);
Target.sin_addr = *(in_addr *)Host->h_addr_list[0]; if(bind(Sock, (PSOCKADDR)&Target, sizeof(Target)))
throw Exception("bind error!"); }
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned long Value;
int PktNum = 0; if(Button1->Caption == "開始"){
Value = true;
if(ioctlsocket(Sock, SIO_RCVALL, &Value))
throw Exception("ioctlsocket SIO_RCVALL error!"); Button1->Caption = "停止";
//ListView1->Items->Clear();
Step = true;
} else{
Value = false;
if(ioctlsocket(Sock, SIO_RCVALL, &Value))
throw Exception("ioctlsocket SIO_RCVALL error!"); Button1->Caption = "開始";
Step = false;
} //跑到這就有問題了? ... 我用label1來顯示封包數, 但是卻沒改變?
/*while(Step){
if(recv(Sock, RcvBuf, 512, 0) > 0){
PktNum ;
Label1->Caption = PktNum;
.............
}
}*/ }
//---------------------------------------------------------------------------
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp>
#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TListView *ListView1;
TButton *Button1;
TLabel *Label1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
SOCKET Sock;
SOCKADDR_IN Target;
int Step;
char RcvBuf[512];
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
麻煩大家看看嘍 ... 謝謝!!!