線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1181
推到 Plurk!
推到 Facebook!

sniffer 的問題

答題得分者是:microbean
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-24 17:31:18 IP:218.160.xxx.xxx 未訂閱
我參考http://wvw.ttian.net/article/show.php?id=101 試著寫sniffer程式,但run的時候都沒有辦法正常的run,麻煩有經驗的前輩們幫我測一下,問題出在哪? 1.我的系統是WIN98和BCB5    2.完整source code 如下:    3.每次執行到這一行就會跳出,不知是硬體的問題?還是該如何修正? if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR) throw Exception("setsockopt IP_HDRINCL error!");    4.再來比較有可能有問題的是這一行   if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)   throw Exception("ioctlsocket SIO_RCVALL error!");    5.因為查了幾個網站的code都和這一個大同小異,但我都是會卡在這兩個地方,不知各位先進是否也曾遇到相同的狀況,該如何解決呢?    
 
//---------------------------------------------------------------------------    #include 
#include 
#include 
#pragma hdrstop    #include "Unit1.h"    #define BUFFER_SIZE 65535
#define SIO_RCVALL  _WSAIOW(IOC_VENDOR,1)    //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  SOCKET   sock;
  SOCKADDR_IN addr_in;
  char    RecvBuf[BUFFER_SIZE];      WSADATA WSAData;
  char  LocalName[16];
  struct hostent *pHost;
  DWORD dwValue;      if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
    throw Exception("WSAStartup error!");      if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET)
    throw Exception("socket setup error!");    
//程式執行到這一行就會跳出
  if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
    throw Exception("setsockopt IP_HDRINCL error!");      if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
    throw Exception("gethostname error!");      if ((pHost = gethostbyname((char*)LocalName)) == NULL)
    throw Exception("gethostbyname error!");      addr_in.sin_addr  = *(in_addr *)pHost->h_addr_list[0]; //IP
  addr_in.sin_family = AF_INET;
  addr_in.sin_port  = htons(57274);      if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
  throw Exception("bind error!");    // 假如 setsockopt 那個地方拿掉,則只執行到這個地方就跳掉
  if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)
  throw Exception("ioctlsocket SIO_RCVALL error!");        // 以下的code暫時先不理會,我的主要目的是上面的程式能正常的執行.      while (1)
  {
    if (recv(sock, RecvBuf, BUFFER_SIZE, 0) > 0)
    {
    }
    Application->ProcessMessages();
  }      WSACleanup();
}
//---------------------------------------------------------------------------    
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-27 12:09:30 IP:210.58.xxx.xxx 未訂閱
提示一個泛用法則 遇到錯誤的時候 先用 WSAGetLastError 來取 error code , 然後再來查問題 . 這樣會比較有方向 . 我沒實做過 BCC 的版本 , 但是我並沒有呼叫 setsockopt IP_HDRINCL . 先看看 error code 吧.. _= 沒事就 winsock 一下 =_
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-03 13:16:59 IP:218.160.xxx.xxx 未訂閱
非常感謝 microbean 前輩的回答,雖然不是直接回答我的問題,但也帶給我很大的幫助,謝謝. 我的問題已經解決了,解決的方式是: 1.作業系統在WINXP下,似乎WIN98會比較麻煩點,沒在網站上找到. 2.if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET) 改成 if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET) 但會不會影響到攔截到的訊息會少一點,我就不知道了,反正我可抓到我的電腦tcp資料進出就可以了. 3.要把 ws2_32.lib 加進來,沒加進來會在bind那行就跳出.
系統時間:2024-05-16 22:06:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!