• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            saga's blog

            突出重點(diǎn),系統(tǒng)全面,不留死角

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              33 Posts :: 2 Stories :: 185 Comments :: 0 Trackbacks

            公告

            QQ:34O859O5

            常用鏈接

            留言簿(15)

            搜索

            •  

            積分與排名

            • 積分 - 210877
            • 排名 - 122

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            ??????? 最近自己因?yàn)閷?shí)際需要,用winpcap開(kāi)發(fā)一個(gè)程序里面有需要轉(zhuǎn)發(fā)包.自己就寫了一個(gè),發(fā)現(xiàn)轉(zhuǎn)發(fā)時(shí)延>500ms.也確實(shí)把自己嚇到了.便把轉(zhuǎn)發(fā)的那段代碼開(kāi)始精減,大致如下
            while((j=pcap_next_ex(slecadopt,&pkt_header,(const?u_char**)&pkt_data))>=0)
            {???
            ?????
            if(j==0)
            ?????
            {
            ?????
            continue;
            ?????}

            ?????
            if(*(unsigned?short?*)(pkt_data+12)==htons(ETH_IP)&&(!(memcmp(pkt_data+6,myip->mac,6)==0))&&*(unsigned?long?*)(pkt_data+30)!=myip->ip&&(!(memcmp(pkt_data,bcast,6)==0)))
            ?????
            {?
            ?????
            for(z=Pipmachead;z!=NULL;z=z->next)
            ?????
            {
            ?????????
            if(*(unsigned?long?*)(pkt_data+30)==z->ip)
            ?????????????
            {
            ?????????????????????? ?memcpy(cmac
            ->mac,z->mac,6);
            ??????????????????????? memcpy(cmac
            ->mac+6,myip->mac,6);
            ????????????????????????memcpy(sendbuf,pkt_data,pkt_header
            ->caplen);
            ??????????????????????? memcpy(sendbuf,cmac,
            12);
            ?????????????????????? pcap_sendpacket(slecadopt,sendbuf,pkt_header
            ->caplen);??????
            ?????????}
            ?
            ?????????
            continue;
            ?????}

            ?????}

            }
            ??????? 過(guò)程很簡(jiǎn)單,pcap_next_ex()收包,在做判斷處理,然后用pcap_sendpacket()發(fā)包.怎么想都不會(huì)有那么大的時(shí)延.很不解就搜索了下關(guān)于pcap_sendpacket()發(fā)包效能的網(wǎng)頁(yè),其中有一個(gè)http://community.csdn.net/Expert/TopicView3.asp?id=4153633來(lái)里面有人說(shuō)
            我用winpcap做個(gè)一個(gè)初步的試驗(yàn),我得機(jī)器是奔4?26,內(nèi)存512,我一個(gè)線程接包,一個(gè)線程收包,用動(dòng)態(tài)連表做緩存,一秒鐘轉(zhuǎn)發(fā)1-2個(gè)包沒(méi)有多大問(wèn)題,要是再多了,就會(huì)又丟包,轉(zhuǎn)發(fā)上千萬(wàn)包要丟幾百個(gè)。
            還有人說(shuō)
            winpcap的sendpacket超級(jí)慢,而且延遲很大。

            我試圖實(shí)現(xiàn)一個(gè)bridge,即一個(gè)端口進(jìn)入的包不經(jīng)修改從一個(gè)端口出,反之亦然。結(jié)果ping的結(jié)果顯示延遲為數(shù)百毫秒級(jí)別,個(gè)別時(shí)候甚至到了1秒。運(yùn)行其它應(yīng)用更是不可忍受。

            我想使用sendQuene,結(jié)果sendQuene的具體用法只見(jiàn)過(guò)預(yù)先準(zhǔn)備好所有的包然后整體發(fā)送的,沒(méi)見(jiàn)過(guò)隨著包來(lái)隨著發(fā)送的例子。或許對(duì)于我的bridge,winpcap是一個(gè)錯(cuò)誤的選擇?又或者大家有什么新鮮的思路?愿意聽(tīng)大家說(shuō)說(shuō)。
            ???? ?? 使我也開(kāi)始懷疑pcap_sendpacket()了.難道真實(shí)pcap_sendpacket()效率底.但是我還是不相信.堂堂winpcap怎么可能怎么慢.使我發(fā)現(xiàn)破綻的使貼子里最后一的人的說(shuō)法:
            我也寫了個(gè)類似的程序,延時(shí)穩(wěn)定在20ms左右,帶寬可以達(dá)到10M
            我發(fā)現(xiàn)一個(gè)有趣的事情,即我在運(yùn)行brigde的服務(wù)器上,運(yùn)行一個(gè)fluke的抓包工具,居然發(fā)現(xiàn)運(yùn)行后,通過(guò)bridge后的時(shí)延居然只有1ms左右了,停止抓包工具后,延時(shí)又回到20ms左右,試了多次情況都一樣

            打開(kāi)網(wǎng)卡的句柄是按下面的參數(shù)執(zhí)行的
            pcap_open(d
            ->name,?//?name?of?the?device?
            65536,?//?portion?of?the?packet?to?capture.
            PCAP_OPENFLAG_PROMISCUOUS,?//?promiscuous?mode?
            1,?//?read?timeout?
            NULL,?//?remote?authentication?
            errbuf?//?error?buffer?
            );?
            對(duì)數(shù)據(jù)報(bào)的捕獲是用pcap_loop函數(shù),我試過(guò)將pcap_open的read?timeout參數(shù)設(shè)置為
            -1,即讀取立即返回,但這樣對(duì)系統(tǒng)資源占用太大,cpu利用率增加到100%,此時(shí)bridge的延時(shí)就很不穩(wěn)定了,從1ms到1s都有。
            ?????? 他在里面特意提到了pcap_open()的read timeout參數(shù),我回想起我的設(shè)的1000ms,也就是一秒.嫌疑很大.(注:我用的是pcap_open_live())
            pcap_open_live(d->name,?1000,?1,?1000,?error)
            然后就去查Winpcap的官方資料http://www.winpcap.org/docs/docs31/html/group__wpcapfunc.html
            里面說(shuō)的很清楚:
            to_ms?specifies?the?read?timeout?in?milliseconds.?The?read?timeout?is?used?to?arrange?that?the?read?not?necessarily?return?immediately?when?a?packet?is?seen,?but?that?it?wait?for?some?amount?of?time?to?allow?more?packets?to?arrive?and?to?read?multiple?packets?from?the?OS?kernel?in?one?operation.?

            ???? 當(dāng)已經(jīng)發(fā)現(xiàn)包之后還會(huì)等多一些的包一起返回,等待時(shí)間就是read timeout.明白了,我把read timeout設(shè)為1以后時(shí)延降到了<10ms.

            ?????其中還需要提醒的是用Ethereal等一些抓包工具看到收包到轉(zhuǎn)發(fā)時(shí)延很大時(shí)就以為是pcap_next_ex()和pcap_sendpacket()函數(shù)之間的處理造成了時(shí)延.這里容易給我們產(chǎn)生一個(gè)假相.以為網(wǎng)卡收到包的時(shí)刻就是轉(zhuǎn)發(fā)程序就要開(kāi)始處理.實(shí)際上pcap_next_ex()還在等待更多的包一起返回.
            ?????所以事發(fā)的原因離事發(fā)現(xiàn)場(chǎng)比較遠(yuǎn).在pcap_open()那.程序就就是怎么千絲萬(wàn)縷的關(guān)聯(lián)著.
            ???? 大家一定要多懷疑自己,別去怪罪工具.winpcap很無(wú)辜的.嘻嘻!!肚子餓了去吃飯!!

            ?????????????????????????????????????????????????????????????????????-----saga.constantine

            posted on 2006-04-16 17:13 saga.constantine 閱讀(11706) 評(píng)論(12)  編輯 收藏 引用 所屬分類: Winpcap

            Feedback

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2006-04-17 08:43 任我行
            學(xué)習(xí)中,我要做的是先收包,然后修改包頭,再發(fā)送包。
            還不知道WinPcap能否做到。
            我也看了看這個(gè)庫(kù)。沒(méi)有你研究的那么深入。
            我在這里關(guān)注你的進(jìn)展。
              回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2006-04-17 08:53 saga.constantine
            @任我行
            謝謝關(guān)注,我也是在學(xué)習(xí),對(duì)winpcap了解也不深,一般能達(dá)到目的就不在研究了,呵呵.收包,改包頭,發(fā)送就是我上面給出代碼的功能.winpcap擅長(zhǎng)的就是這方面把.發(fā)送你任意改過(guò)的包!  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2006-04-17 09:26 任我行
            @saga.constantine
            好,其實(shí)我想做一個(gè)proxy,先收,再改,然后發(fā)。
            有方向就好辦了。到時(shí)搞到問(wèn)題再來(lái)向你要答案。
              回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2006-04-28 16:52 任我行
            剛才練習(xí)了以下WinPcap,還是不太會(huì)用。
            能否發(fā)些例子來(lái)學(xué)習(xí)學(xué)習(xí)。
            先來(lái)一個(gè)發(fā)包程序,例如:自己組裝一些IP包,然后發(fā)出去,
            在來(lái)一個(gè)收包程序,接收上面發(fā)過(guò)來(lái)的IP包,并提取其中相關(guān)的數(shù)據(jù)。

              回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2006-04-28 19:22 saga.constantine
            @任我行
            你看我的另一篇post里面的arp欺騙 代碼拉.里面發(fā)包收包都有......
            for(k=0;k<6;k++)
            {
            eth.eh_dst[k]=0xff;
            eth.eh_src[k]=0x0f;
            arp.arp_sha[k]=0x0f;
            arp.arp_tha[k]=0x00;
            }
            eth.eh_type=htons(ETH_ARP);
            arp.arp_hdr=htons(ARP_HARDWARE);
            arp.arp_pro=htons(ETH_IP);
            arp.arp_hln=6;
            arp.arp_pln=4;
            arp.arp_opt=htons(ARP_REQUEST);
            arp.arp_tpa=myip->ip;
            arp.arp_spa=inet_addr("127.0.0.2"); //隨便設(shè)的請(qǐng)求方ip

            memset(sendbuf,0,sizeof(sendbuf));
            memcpy(sendbuf,&eth,sizeof(eth));
            memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));

            if(pcap_sendpacket(slecadopt,sendbuf,42)==0)
            {
            printf("PacketSend succeed\n\n");
            }
            else
            {
            printf("PacketSendPacket in getmine Error: %d\n",GetLastError());
            return 0;
            }
            就可以發(fā)一個(gè)簡(jiǎn)單的arp請(qǐng)求包!!

              回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2008-06-27 08:54 狼唇之吻
            LZ你好,我使用wpcap編程時(shí),使用int pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf)獲取網(wǎng)卡列表,在windows xp下沒(méi)有發(fā)生任何問(wèn)題,但是在windows 2000里面發(fā)現(xiàn)有很大部分獲取不到正在使用的網(wǎng)卡。

            而是獲取到的只有一個(gè)dialup and vpn capture

            請(qǐng)問(wèn)這個(gè)大概什么原因。
            我測(cè)試了100臺(tái)左右的2000系統(tǒng),有將近一半不行。200多臺(tái)XP一點(diǎn)問(wèn)題都沒(méi)有  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2008-07-03 09:45 saga
            抱歉 不知道@狼唇之吻
              回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2008-07-03 19:19 SG
            轉(zhuǎn)發(fā)包出去的包不會(huì)又被pcap_next_ex捕獲回來(lái)嗎??
            如果 我只想捕獲接收到的包,不想捕獲網(wǎng)卡發(fā)出去的包有沒(méi)辦法哪?
            前提不提取數(shù)據(jù)判斷方向,我也看了點(diǎn)資料資料上都寫著
            if(pcap_next_ex == 1)我實(shí)驗(yàn)過(guò)好象不太有用我所有發(fā)出去的包都被忠實(shí)的捕獲回來(lái),很郁悶,當(dāng)然我不是僅僅把捕獲的到的包修改下再發(fā)出發(fā) 我發(fā)出的是另外一個(gè)包 大概結(jié)構(gòu)就象第一個(gè)程序快 郁悶啊  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2009-01-13 15:42 complexs.net
            可以使用Winpcap提供的過(guò)濾函數(shù),來(lái)過(guò)濾不需要的包.
            這樣可以提高網(wǎng)絡(luò)堆棧的性能,提高發(fā)包速度.

            關(guān)于Winpcap丟包的現(xiàn)象,是因?yàn)榘l(fā)包的速度慢造成的,應(yīng)該盡可能的降低發(fā)包速度.

            我使用Winpcap開(kāi)發(fā),傳送10G大的文件,速度平均在8M左右.

            理想速度應(yīng)該盡量接近10M,功力不夠~!  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2009-12-25 09:51 jjl
            你試試在PCAP_OPEN()把打開(kāi)標(biāo)志設(shè)置為混雜模式和不捕獲本地包模式,也就是數(shù)字9.  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2012-06-03 18:44 吳同學(xué)
            LZ十分謝謝你啊!!!!
            我的程序ARP做的監(jiān)控軟件,就是覺(jué)得好慢!!被你這樣一說(shuō)改了那個(gè)時(shí)間,真的快了好多啊!!!!!
            十分謝謝!!
            雖然是好多年前的.  回復(fù)  更多評(píng)論
              

            # re: [原創(chuàng)]用Winpcap函數(shù)轉(zhuǎn)發(fā)包需要留心的一點(diǎn) 2013-12-17 22:56 11
            你做出來(lái)了嗎?@SG
              回復(fù)  更多評(píng)論
              

            伊人丁香狠狠色综合久久| 日本免费久久久久久久网站| 亚洲精品美女久久久久99| 久久91精品国产91久久户| 国产成人久久精品一区二区三区 | 亚洲国产成人久久综合野外| 99国产精品久久| 国产精品久久久久国产A级| 日韩人妻无码一区二区三区久久| 久久亚洲AV无码精品色午夜麻豆| 三级韩国一区久久二区综合| 久久人人爽人人爽人人片AV麻豆| 成人国内精品久久久久影院VR| 曰曰摸天天摸人人看久久久| 久久综合鬼色88久久精品综合自在自线噜噜 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 乱亲女H秽乱长久久久| 久久夜色撩人精品国产| 国产一区二区精品久久| 亚洲AV无码一区东京热久久| 久久人搡人人玩人妻精品首页| 久久99热精品| 国产精品一区二区久久国产| 久久精品国产色蜜蜜麻豆| 伊人久久大香线蕉AV色婷婷色 | 亚洲国产成人久久综合一区77 | 人妻精品久久无码区| 久久99热这里只频精品6| 久久久受www免费人成| 三级三级久久三级久久| 久久精品国产91久久麻豆自制| 人人狠狠综合久久88成人| 久久国内免费视频| 狠狠色丁香久久婷婷综合_中 | 久久久精品国产亚洲成人满18免费网站 | 久久综合亚洲色HEZYO社区| 少妇被又大又粗又爽毛片久久黑人 | 91久久精品91久久性色| 久久亚洲日韩精品一区二区三区| 99精品久久久久久久婷婷| 少妇久久久久久久久久|