給出一個 netdump 程序, 抓包用的. 如果改進了,也希望貼出(摘自Chinaunix->論壇首頁->C/C++)

c.gif
ChinaUnix.net
首頁 | 論壇 | 精華 | 博客 | 人才 | 沙龍 | 搜索
images
您好,xxbview,歡迎進入ChinaUnix論壇
我的博客 | 收藏夾 | 個人專集
個人資料 | 您沒有新的站內信件 | 註銷登錄
搜索高級搜索
金笛郵件系統-因Linux而精彩
JSP PHP虛擬主機,自由綁定域名,多個上存目錄
給出一個 netdump 程序, 抓包用的. 如果改進了,也希望貼出
前往頁面 1, 2, 3   下一頁
 
發表新帖   回覆帖子    ChinaUnix.net首頁 -> 論壇首頁 -> C/C++ 將本帖添加到我的收藏夾添加到我的收藏夾
閱讀上一個主題 :: 閱讀下一個主題  
作者 留言
此人爲版主思一克     
版主 - 天使


天使
註冊時間: 2003-08-25
最後登錄: 2005-01-10
帖子總數: 1165
精華帖子: 1
原創精華: 0
來自: 東城

在線狀態: ...保密...
帖子總數發表於: 2005-01-07 15:01    發表主題: 給出一個 netdump 程序, 抓包用的. 如果改進了,也希望貼出 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

最基本的,在linux i386上
代碼:


//netdump.c 

#include <stdio.h>   
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> 
#include <netinet/ip.h>
#include <string.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>

void die(char *why, int n)
{
  perror(why);
  exit(n);
}


int do_promisc(char *nif, int sock )
{
struct ifreq ifr;
 
  strncpy(ifr.ifr_name, nif,strlen(nif)+1);
  if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {       
    die("ioctl", 2);
  }
  ifr.ifr_flags |= IFF_PROMISC;
  if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 ) {
    die("ioctl", 3);
  }
}

char buf[2*32767];

main()
{
struct sockaddr_in addr;
struct iphdr *ip;
struct tcphdr *tcp;
int sock, r, len;
char *data;
char ss[32], dd[32];

  if((sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP)) == -1) die("socket", 1);
  do_promisc("eth0", sock);
 
  for(;;) {
    len = sizeof(addr);
    r = recvfrom(sock,(char *)buf,sizeof(buf),0,(struct sockaddr *)&addr,&len);
    buf[r] = 0;
    ip = (struct iphdr *)buf;
    tcp = (struct tcphdr *)(buf + sizeof(struct iphdr));

    printf("PktSize: %d IPLEN %d PROT %d  %s:%d-->%s:%d %d /n",
   r, ip->tot_len,
   ip->protocol,
   strcpy(ss, inet_ntoa(*(struct in_addr*)&(ip->saddr))),
   ntohs(tcp->source),
   strcpy(dd, inet_ntoa(*(struct in_addr*)&(ip->daddr))),
   ntohs(tcp->dest),
   tcp->doff
   );
    data = (char*)tcp + 4*tcp->doff;
    printf("data = %s/n", data);
  }

}




_________________
提供QMAIL系統技術支持。構建更完美的MAIL系統。Email: [email protected]
返回頁首
閱覽會員資料 發送站內信件 發送電子郵件 北京網通IDC主機託管,CU會員優惠中!
此人爲版主win_hate   性別:帥哥  
版主 - 大天使

150)this.width=140" border=0>
大天使
註冊時間: 2003-05-14
最後登錄: 2005-01-10
帖子總數: 1813
精華帖子: 1
原創精華: 1
來自: 廣東廣州
BLOG主頁:進入
在線狀態: ...保密...
帖子總數發表於: 2005-01-07 15:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

icon_biggrin.gif


_________________
閉關中......偶爾冒泡...各位多擔待。

In computing, turning the obvious into the useful is living definition of the word "frustration".

http://my.chinaunix.net/win_hate/ || http://www.gzisi.com/
返回頁首
閱覽會員資料 發送站內信件 瀏覽發表者的主頁 北京網通IDC主機託管,CU會員優惠中!
此人爲版主思一克     
版主 - 天使


天使
註冊時間: 2003-08-25
最後登錄: 2005-01-10
帖子總數: 1165
精華帖子: 1
原創精華: 0
來自: 東城

在線狀態: ...保密...
帖子總數發表於: 2005-01-07 15:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

那符號, 是飄揚,還是批評?


_________________
提供QMAIL系統技術支持。構建更完美的MAIL系統。Email: [email protected]
返回頁首
閱覽會員資料 發送站內信件 發送電子郵件 北京網通IDC主機託管,CU會員優惠中!
此人爲版主win_hate   性別:帥哥  
版主 - 大天使

150)this.width=140" border=0>
大天使
註冊時間: 2003-05-14
最後登錄: 2005-01-10
帖子總數: 1813
精華帖子: 1
原創精華: 1
來自: 廣東廣州
BLOG主頁:進入
在線狀態: ...保密...
帖子總數發表於: 2005-01-07 15:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

是這個:


good_re.gif400)this.width=400;if(this.height>450)this.height=450" border=0>

我只會用 libpcap 抓, icon_redface.gif



_________________
閉關中......偶爾冒泡...各位多擔待。

In computing, turning the obvious into the useful is living definition of the word "frustration".

http://my.chinaunix.net/win_hate/ || http://www.gzisi.com/


最後進行編輯的是 win_hate on 2005-01-07 15:01, 總計第 1 次編輯
返回頁首
閱覽會員資料 發送站內信件 瀏覽發表者的主頁 北京網通IDC主機託管,CU會員優惠中!
superdoctor   性別:帥哥  
風雲使者

150)this.width=140" border=0>
風雲使者
註冊時間: 2003-01-16
最後登錄: 2005-01-10
帖子總數: 474
精華帖子: 0
原創精華: 0
來自: beijing city
BLOG主頁:進入
在線狀態: ...離線...
帖子總數發表於: 2005-01-07 15:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

不僅僅是表揚!
已經精華了,此時無聲勝有聲



_________________
please click this link for detail:
www.supermail.cn

Don't touch me!
返回頁首
閱覽會員資料 發送站內信件 瀏覽發表者的主頁 北京網通IDC主機託管,CU會員優惠中!
此人爲版主思一克     
版主 - 天使


天使
註冊時間: 2003-08-25
最後登錄: 2005-01-10
帖子總數: 1165
精華帖子: 1
原創精華: 0
來自: 東城

在線狀態: ...保密...
帖子總數發表於: 2005-01-07 15:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

精華什麼。我就胡亂搞一個,因爲看這幾天總有問的帖子。
沒有放回貼是因爲怕一會就消失了



_________________
提供QMAIL系統技術支持。構建更完美的MAIL系統。Email: [email protected]
返回頁首
閱覽會員資料 發送站內信件 發送電子郵件 北京網通IDC主機託管,CU會員優惠中!
黃山鬆   性別:帥哥  
聖騎士


聖騎士
註冊時間: 2004-09-16
最後登錄: 2005-01-10
帖子總數: 92
精華帖子: 0
原創精華: 0


在線狀態: ...離線...
帖子總數發表於: 2005-01-07 20:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

還不錯,呵呵
不過你這個功能稍微太弱了點icon_smile.gif
我幫你改了改,你原來的只能收到IP層的數據,而且只能有針對性的收,現在可以收鏈路層也就是以太網包icon_smile.gif
而且是大小各個類型統吃,呵呵
代碼:
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> 
#include <netinet/ip.h>
#include <string.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/if_ether.h>

void die(char *why, int n)
{
  perror(why);
  exit(n);
}


int do_promisc(char *nif, int sock )
{
   struct ifreq ifr;
   
   strncpy(ifr.ifr_name, nif,strlen(nif)+1);
     if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
     {       
       die("ioctl", 2);
     }
     ifr.ifr_flags |= IFF_PROMISC;
     
     if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )
     {
       die("ioctl", 3);
     }

}

char buf[2*32767];

main()
{
   struct sockaddr_in addr;
   struct ethhdr *peth;
   struct iphdr *pip;                                                                    
   struct tcphdr *ptcp;
   struct udphdr *pudp;
   /*add more protocol head here....*/
   
   int sock, r, len;                                                                    
   char *data;
   char *ptemp;
   
   char ss[32], dd[32];     
   int i;

     if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1)
      die("socket", 1);

   do_promisc("eth0", sock);
 
     for(;;)
   {
          len = sizeof(addr);
          r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);
          buf[r] = 0;
      ptemp = buf;
      /*which can get source mac address and destnation address, and which network packet, here is OSI-2, link layer*/
      peth = (struct ethhdr *)ptemp;
      
      ptemp += sizeof(struct ethhdr);
      /*which get IP layer informations, includes which transport protocol, source and destnation IP address...*/      
          pip = (struct iphdr *)ptemp;

      /*   
        * which can get transport layer informations, such as: transport socket port, transport layer includes
        * TCP, UDP, ICMP, IGMP......, can get which transport protocol from IP header
        */
      ptemp += sizeof(struct iphdr);
      switch(pip->protocol)
      {
         case   IPPROTO_TCP:
            ptcp = (struct tcphdr *)ptemp;
            printf("TCP pkt:/n");
            /*
              * and your service code....
              */
         break;

         case   IPPROTO_UDP:
            pudp = (struct udphdr *)ptemp;
                printf("UDP pkt:/n len:%d payload len:%d from %s:%d to %s:%d/n",
                        r,
                        ntohs(pudp->len),
                        strcpy(ss, inet_ntoa(*(struct in_addr*)&(pip->saddr))),
                        ntohs(pudp->source),
                        strcpy(dd, inet_ntoa(*(struct in_addr*)&(pip->daddr))),
                        ntohs(pudp->dest)
            );
            /*
              * and your service code....
              */
         break;

         case    IPPROTO_ICMP:
            printf("ICMP pkt:/n");
         break;
            
         case    IPPROTO_IGMP:
            printf("IGMP pkt:/n");
         break;

         /*
           .
           .
           .
           .
           .
           */
         default:
            printf("Unkown pkt, protocl:%d/n", pip->protocol);
         break;
      }
      }   
}
[/code]



最後進行編輯的是 黃山鬆 on 2005-01-10 13:01, 總計第 1 次編輯
返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
黃山鬆   性別:帥哥  
聖騎士


聖騎士
註冊時間: 2004-09-16
最後登錄: 2005-01-10
帖子總數: 92
精華帖子: 0
原創精華: 0


在線狀態: ...離線...
帖子總數發表於: 2005-01-07 20:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

順便建議一下,我覺得精華區應該更精華一些!
不能是版主就精華哦icon_smile.gif


返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
此人爲版主win_hate   性別:帥哥  
版主 - 大天使

150)this.width=140" border=0>
大天使
註冊時間: 2003-05-14
最後登錄: 2005-01-10
帖子總數: 1813
精華帖子: 1
原創精華: 1
來自: 廣東廣州
BLOG主頁:進入
在線狀態: ...保密...
帖子總數發表於: 2005-01-07 22:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

黃山鬆 寫到:
順便建議一下,我覺得精華區應該更精華一些!
不能是版主就精華哦icon_smile.gif


建議是好的,不過我們這裏有

引用:
是版主就精華哦


的情況麼? icon_eek.gif



_________________
閉關中......偶爾冒泡...各位多擔待。

In computing, turning the obvious into the useful is living definition of the word "frustration".

http://my.chinaunix.net/win_hate/ || http://www.gzisi.com/
返回頁首
閱覽會員資料 發送站內信件 瀏覽發表者的主頁 北京網通IDC主機託管,CU會員優惠中!
黃山鬆   性別:帥哥  
聖騎士


聖騎士
註冊時間: 2004-09-16
最後登錄: 2005-01-10
帖子總數: 92
精華帖子: 0
原創精華: 0


在線狀態: ...離線...
帖子總數發表於: 2005-01-08 10:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

win_hate 寫到:


的情況麼? icon_eek.gif

有則改之,無則加勉:)
沒別的意思,只想c/c++版更好,本貼樓主好象是版主吧?


返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
assiss     
風雲使者

150)this.width=140" border=0>
風雲使者
註冊時間: 2003-11-12
最後登錄: 2005-01-10
帖子總數: 504
精華帖子: 0
原創精華: 0

BLOG主頁:進入
在線狀態: ...離線...
帖子總數發表於: 2005-01-08 10:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

黃山鬆 寫到:

有則改之,無則加勉:)
沒別的意思,只想c/c++版更好,本貼樓主好象是版主吧?

也難怪黃山鬆老兄會產生誤解。
CU的頭銜實在讓人頭大。
發的帖子多了,就是版主?還是某一個版的版主?反正我是沒明白。


返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
此人爲版主win_hate   性別:帥哥  
版主 - 大天使

150)this.width=140" border=0>
大天使
註冊時間: 2003-05-14
最後登錄: 2005-01-10
帖子總數: 1813
精華帖子: 1
原創精華: 1
來自: 廣東廣州
BLOG主頁:進入
在線狀態: ...保密...
帖子總數發表於: 2005-01-08 10:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

在我眼裏,思一克是一位樂於助人的技術高手,我都沒注意到他是斑竹。何況還不是c 版的。

您要是覺得這個精華給得不對,可以說出理由,我跟別的斑竹商量一下。


我給精華的理由如下:

問這種問題的人常有,直接能用的答覆就沒有。一般的回答就是“看xxx的代碼”,或者“用 libpcap"(我的答覆)。而思一克的回覆直接能用。

思一克給出的是一個最小例子,演示瞭如何使用 ioctl 把 網絡設備設置爲混雜模式。規模小,單純,就容易被理解,並可在其上作擴展,比如您後來的例子。



_________________
閉關中......偶爾冒泡...各位多擔待。

In computing, turning the obvious into the useful is living definition of the word "frustration".

http://my.chinaunix.net/win_hate/ || http://www.gzisi.com/
返回頁首
閱覽會員資料 發送站內信件 瀏覽發表者的主頁 北京網通IDC主機託管,CU會員優惠中!
honkily     
俠客

150)this.width=140" border=0>
俠客
註冊時間: 2004-09-12
最後登錄: 2005-01-08
帖子總數: 19
精華帖子: 0
原創精華: 0
來自: 上海

在線狀態: ...離線...
帖子總數發表於: 2005-01-08 17:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

確實好用!收藏~

返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
arcsiny   性別:帥哥  
聖騎士

150)this.width=140" border=0>
聖騎士
註冊時間: 2003-04-17
最後登錄: 2005-01-10
帖子總數: 92
精華帖子: 1
原創精華: 0

BLOG主頁:進入
在線狀態: ...離線...
帖子總數發表於: 2005-01-10 09:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

呵呵 客觀的講 樓主給的例子確實很簡單,如果給精華的話,我想 黃山鬆 的更好一些。我想黃山鬆也是好意,包括我在內。


_________________
曾因酒醉鞭名馬
生怕情多累美人
返回頁首
閱覽會員資料 發送站內信件 北京網通IDC主機託管,CU會員優惠中!
此人爲版主思一克     
版主 - 天使


天使
註冊時間: 2003-08-25
最後登錄: 2005-01-10
帖子總數: 1165
精華帖子: 1
原創精華: 0
來自: 東城

在線狀態: ...保密...
帖子總數發表於: 2005-01-10 09:01    發表主題: 推薦此帖爲精華,以便版主設置 舉報此帖,以便版主處理 引用並回復

謝謝你的意見。

我原來在WIN上做過那東西,有個非常全的程序,顯示幾乎所有協議,並按DOS DEBUG的D命令格式顯示的。

我是故意裁剪下來貼出來的,目的就是教學用,爲了是問題本質更清楚。




arcsiny 寫到:
呵呵 客觀的講 樓主給的例子確實很簡單,如果給精華的話,我想 黃山鬆 的更好一些。我想黃山鬆也是好意,包括我在內。



_________________
提供QMAIL系統技術支持。構建更完美的MAIL系統。Email: [email protected]
返回頁首
閱覽會員資料 發送站內信件 發送電子郵件 北京網通IDC主機託管,CU會員優惠中!
發表新帖   回覆帖子    ChinaUnix.net首頁 -> 論壇首頁 -> C/C++ 論壇時間爲 北京時間
前往頁面 1, 2, 3   下一頁
1頁/共3
訂閱本主題

轉跳到:  
可以發佈新主題
可以在這個論壇回覆主題
可以在這個論壇編輯自己的帖子
不能在這個論壇刪除自己的帖子
可以在這個論壇發表投票
可以 在這個版面上傳圖片或文件
可以 在這個版面下載文件




本論壇言論純屬發表者個人意見,與 ChinaUnix.net 立場無關

Copyright © 2001-2005 ChinaUnix.net   All Rights Reserved   BBS PoweredBy CU-phpBB version


mail.gif

感謝所有關心和支持過ChinaUnix的朋友們

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章