锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲欧美一级,亚洲欧美一区二区精品久久久,午夜日韩激情http://www.shnenglu.com/elva/category/8427.htmlzh-cnFri, 29 Nov 2013 05:53:30 GMTFri, 29 Nov 2013 05:53:30 GMT605imx2shttp://www.shnenglu.com/elva/archive/2013/11/29/204513.html鍙跺瓙鍙跺瓙Fri, 29 Nov 2013 05:34:00 GMThttp://www.shnenglu.com/elva/archive/2013/11/29/204513.htmlhttp://www.shnenglu.com/elva/comments/204513.htmlhttp://www.shnenglu.com/elva/archive/2013/11/29/204513.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/204513.htmlhttp://www.shnenglu.com/elva/services/trackbacks/204513.html









涓嬭澆錛?div>http://www.easyice.cn/5imx2s/download.htm


鍙跺瓙 2013-11-29 13:34 鍙戣〃璇勮
]]>
Socket I/O妯″瀷鍏ㄦ帴瑙?/title><link>http://www.shnenglu.com/elva/archive/2010/10/29/131764.html</link><dc:creator>鍙跺瓙</dc:creator><author>鍙跺瓙</author><pubDate>Fri, 29 Oct 2010 09:12:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2010/10/29/131764.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/131764.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2010/10/29/131764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/131764.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/131764.html</trackback:ping><description><![CDATA[<div class="hvzpftn" id=app-share-content> <p>鏈枃綆鍗曚粙緇嶄簡褰撳墠Windows鏀寔鐨勫悇縐峉ocket I/O妯″瀷錛屽鏋滀綘鍙戠幇鍏朵腑瀛樺湪浠涔堥敊璇鍔″繀璧愭暀銆?/p> <p>    涓錛歴elect妯″瀷<br>    浜岋細(xì)WSAAsyncSelect妯″瀷<br>    涓夛細(xì)WSAEventSelect妯″瀷<br>    鍥涳細(xì)Overlapped I/O 浜嬩歡閫氱煡妯″瀷<br>    浜旓細(xì)Overlapped I/O 瀹屾垚渚嬬▼妯″瀷<br>    鍏細(xì)IOCP妯″瀷</p> <p>    鑰侀檲鏈変竴涓湪澶栧湴宸ヤ綔鐨勫コ鍎匡紝涓嶈兘緇忓父鍥炴潵錛岃侀檲鍜屽ス閫氳繃淇′歡鑱旂郴銆備粬浠殑淇′細(xì)琚偖閫掑憳鎶曢掑埌浠栦滑鐨勪俊綆遍噷銆?br>    榪欏拰Socket妯″瀷闈炲父綾諱技銆備笅闈㈡垜灝變互鑰侀檲鎺ユ敹淇′歡涓轟緥璁茶ВSocket I/O妯″瀷~~~</p> <p>涓錛歴elect妯″瀷</p> <p>鑰侀檲闈炲父鎯崇湅鍒板コ鍎跨殑淇°備互鑷充簬浠栨瘡闅?0鍒嗛挓灝變笅妤兼鏌ヤ俊綆憋紝鐪嬫槸鍚︽湁濂沖効鐨勪俊~~~~~<br>鍦ㄨ繖縐嶆儏鍐典笅錛?#8220;涓嬫ゼ媯(gè)鏌ヤ俊綆?#8221;鐒跺悗鍥炲埌妤間笂鑰借浜嗚侀檲澶鐨勬椂闂達(dá)紝浠ヨ嚦浜庤侀檲鏃犳硶鍋氬叾浠栧伐浣溿?br>select妯″瀷鍜岃侀檲鐨勮繖縐嶆儏鍐甸潪甯哥浉浼鹼細(xì)鍛ㄨ屽濮嬪湴鍘繪鏌?.....濡傛灉鏈夋暟鎹?.....鎺ユ敹/鍙戦?......</p> <p>浣跨敤綰跨▼鏉elect搴旇鏄氱敤鐨勫仛娉曪細(xì)</p> <p><br>procedure TListenThread.Execute;<br>var<br>addr     : TSockAddrIn;<br>fd_read : TFDSet;<br>timeout : TTimeVal;<br>ASock,<br>MainSock : TSocket;<br>len, i   : Integer;<br>begin<br>MainSock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );<br>addr.sin_family := AF_INET;<br>addr.sin_port := htons(5678);<br>addr.sin_addr.S_addr := htonl(INADDR_ANY);<br>bind( MainSock, @addr, sizeof(addr) );<br>listen( MainSock, 5 );</p> <p>while (not Terminated) do<br>begin<br>    FD_ZERO( fd_read );<br>    FD_SET( MainSock, fd_read );<br>    timeout.tv_sec := 0;<br>    timeout.tv_usec := 500;<br>    if select( 0, @fd_read, nil, nil, @timeout ) > 0 then {//鑷沖皯鏈?涓瓑寰匒ccept鐨刢onnection}<br>    begin<br>      if FD_ISSET( MainSock, fd_read ) then<br>      begin<br>        for i:=0 to fd_read.fd_count-1 do {//娉ㄦ剰錛宖d_count <= 64錛屼篃灝辨槸璇磗elect鍙兘鍚屾椂綆$悊鏈澶?4涓繛鎺<br>        begin<br>          len := sizeof(addr);<br>          ASock := accept( MainSock, addr, len );<br>          if ASock <> INVALID_SOCKET then<br>              .{//涓篈Sock鍒涘緩涓涓柊鐨勭嚎紼嬶紝鍦ㄦ柊鐨勭嚎紼嬩腑鍐嶄笉鍋滃湴select}<br>        end; <br>      end; <br>    end; <br>end; {//while (not self.Terminated)}</p> <p>shutdown( MainSock, SD_BOTH );<br>closesocket( MainSock );<br>end;</p> <p> </p> <p>浜岋細(xì)WSAAsyncSelect妯″瀷</p> <p>鍚庢潵錛岃侀檲浣跨敤浜嗗井杞叕鍙哥殑鏂板紡淇$銆傝繖縐嶄俊綆遍潪甯稿厛榪涳紝涓鏃︿俊綆遍噷鏈夋柊鐨勪俊浠訛紝鐩栬尐灝變細(xì)緇欒侀檲鎵撶數(shù)璇濓細(xì)鍠傦紝澶х埛錛屼綘鏈夋柊鐨勪俊浠朵簡錛佷粠姝わ紝鑰侀檲鍐嶄篃涓嶅繀棰戠箒涓婁笅妤兼鏌ヤ俊綆變簡錛岀墮涔熶笉鐤間簡錛屼綘鐬呭噯浜嗭紝钃濆ぉ......涓嶆槸錛屽井杞瘇~~~~~~~<br>寰蔣鎻愪緵鐨刉SAAsyncSelect妯″瀷灝辨槸榪欎釜鎰忔濄?/p> <p>WSAAsyncSelect妯″瀷鏄疻indows涓嬫渶綆鍗曟槗鐢ㄧ殑涓縐峉ocket I/O妯″瀷銆備嬌鐢ㄨ繖縐嶆ā鍨嬫椂錛學(xué)indows浼?xì)鎶娋|戠粶浜嬩歡浠ユ秷鎭殑褰㈠娍閫氱煡搴旂敤紼嬪簭銆?br>棣栧厛瀹氫箟涓涓秷鎭爣紺哄父閲忥細(xì)<br>const WM_SOCKET = WM_USER + 55;<br>鍐嶅湪涓籉orm鐨刾rivate鍩熸坊鍔犱竴涓鐞嗘娑堟伅鐨勫嚱鏁板0鏄庯細(xì)</p> <p><br>private<br>procedure WMSocket(var Msg: TMessage); message WM_SOCKET;<br>{鐒跺悗灝卞彲浠ヤ嬌鐢╓SAAsyncSelect浜嗭細(xì)}</p> <p><br>Code<br>var<br>addr : TSockAddr;<br>sock : TSocket;</p> <p>sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );<br>addr.sin_family := AF_INET;<br>addr.sin_port := htons(5678);<br>addr.sin_addr.S_addr := htonl(INADDR_ANY);<br>bind( m_sock, @addr, sizeof(SOCKADDR) );</p> <p>WSAAsyncSelect( m_sock, Handle, WM_SOCKET, FD_ACCEPT or FD_CLOSE );</p> <p>listen( m_sock, 5 );<br>   <br>搴旂敤紼嬪簭鍙互瀵規(guī)敹鍒癢M_SOCKET娑堟伅榪涜鍒嗘瀽錛屽垽鏂槸鍝竴涓猻ocket浜х敓浜嗙綉緇滀簨浠朵互鍙?qiáng)浜嬩欢绫诲瀷锛?xì)</p> <p><br>procedure TfmMain.WMSocket(var Msg: TMessage);<br>var<br>sock    : TSocket;<br>addr    : TSockAddrIn;<br>addrlen : Integer;<br>buf     : Array [0..4095] of Char;<br>begin<br>{//Msg鐨刉Param鏄駭鐢熶簡緗戠粶浜嬩歡鐨剆ocket鍙ユ焺錛孡Param鍒欏寘鍚簡浜嬩歡綾誨瀷}<br>case WSAGetSelectEvent( Msg.LParam ) of<br>    FD_ACCEPT :<br>    begin<br>      addrlen := sizeof(addr);<br>      sock := accept( Msg.WParam, addr, addrlen );<br>      if sock <> INVALID_SOCKET then<br>         WSAAsyncSelect( sock, Handle, WM_SOCKET, FD_READ or FD_WRITE or FD_CLOSE );<br>    end;</p> <p>    FD_CLOSE : closesocket( Msg.WParam );<br>    FD_READ : recv( Msg.WParam, buf[0], 4096, 0 );<br>    FD_WRITE : ;<br>end; <br>end;</p> <p>涓夛細(xì)WSAEventSelect妯″瀷</p> <p>鍚庢潵錛屽井杞殑淇$闈炲父鐣呴攢錛岃喘涔板井杞俊綆辯殑浜轟互鐧句竾璁℃暟......浠ヨ嚦浜庣洊鑼ㄦ瘡澶?4灝忔椂緇欏鎴鋒墦鐢?shù)璇濆Q岀瘡寰楄叞閰歌儗鐥涳紝鍠濊殎鍔涚閮戒笉濂戒嬌~~~~~~<br>寰蔣鏀硅繘浜嗕粬浠殑淇$錛氬湪瀹㈡埛鐨勫涓坊鍔犱竴涓檮鍔犺緗紝榪欎釜瑁呯疆浼?xì)鐩戣瀹㈡堬L(fēng)殑淇$錛屾瘡褰撴柊鐨勪俊浠舵潵涓達(dá)紝姝よ緗細(xì)鍙戝嚭“鏂頒俊浠跺埌杈?#8221;澹幫紝鎻愰啋鑰侀檲鍘繪敹淇°傜洊鑼ㄧ粓浜庡彲浠ョ潯瑙変簡銆?/p> <p>鍚屾牱瑕佷嬌鐢ㄧ嚎紼嬶細(xì)</p> <p><br>procedure TListenThread.Execute;<br>var<br>hEvent : WSAEvent;<br>ret    : Integer;<br>ne     : TWSANetworkEvents;<br>sock   : TSocket;<br>adr    : TSockAddrIn;<br>sMsg   : String;<br>Index,<br>EventTotal : DWORD;<br>EventArray : Array [0..WSA_MAXIMUM_WAIT_EVENTS-1] of WSAEVENT;<br>begin<br>   socket bind <br>hEvent := WSACreateEvent();<br>WSAEventSelect( ListenSock, hEvent, FD_ACCEPT or FD_CLOSE );<br>   listen</p> <p>while ( not Terminated ) do<br>begin<br>    Index := WSAWaitForMultipleEvents( EventTotal, @EventArray[0], FALSE, WSA_INFINITE, FALSE );<br>    FillChar( ne, sizeof(ne), 0 );<br>    WSAEnumNetworkEvents( SockArray[Index-WSA_WAIT_EVENT_0], EventArray[Index-WSA_WAIT_EVENT_0], @ne );</p> <p>    if ( ne.lNetworkEvents and FD_ACCEPT ) > 0 then<br>    begin<br>      if ne.iErrorCode[FD_ACCEPT_BIT] <> 0 then<br>         continue;</p> <p>      ret := sizeof(adr);<br>      sock := accept( SockArray[Index-WSA_WAIT_EVENT_0], adr, ret );<br>      if EventTotal > WSA_MAXIMUM_WAIT_EVENTS-1 then{//榪欓噷W(xué)SA_MAXIMUM_WAIT_EVENTS鍚屾牱鏄?4}<br>      begin<br>        closesocket( sock );<br>        continue;<br>      end;</p> <p>      hEvent := WSACreateEvent();<br>      WSAEventSelect( sock, hEvent, FD_READ or FD_WRITE or FD_CLOSE );<br>      SockArray[EventTotal] := sock;<br>      EventArray[EventTotal] := hEvent;<br>      Inc( EventTotal );<br>    end;</p> <p>    if ( ne.lNetworkEvents and FD_READ ) > 0 then<br>    begin<br>      if ne.iErrorCode[FD_READ_BIT] <> 0 then<br>         continue;<br>      FillChar( RecvBuf[0], PACK_SIZE_RECEIVE, 0 );<br>      ret := recv( SockArray[Index-WSA_WAIT_EVENT_0], RecvBuf[0], PACK_SIZE_RECEIVE, 0 );<br>       <br>    end;<br>end;<br>end;</p> <p>鍥涳細(xì)Overlapped I/O 浜嬩歡閫氱煡妯″瀷</p> <p>鍚庢潵錛屽井杞氳繃璋冩煡鍙戠幇錛岃侀檲涓嶅枩嬈笂涓嬫ゼ鏀跺彂淇′歡錛屽洜涓轟笂涓嬫ゼ鍏跺疄寰堟氮璐規(guī)椂闂淬備簬鏄井杞啀嬈℃敼榪涗粬浠殑淇$銆傛柊寮忕殑淇$閲囩敤浜嗘洿涓哄厛榪涚殑鎶鏈紝鍙鐢ㄦ埛鍛婅瘔寰蔣鑷繁鐨勫鍦ㄥ嚑妤煎嚑鍙鳳紝鏂板紡淇$浼?xì)鎶婁俊錃g鐩存帴浼犻佸埌鐢ㄦ埛鐨勫涓紝鐒跺悗鍛婅瘔鐢ㄦ埛錛屼綘鐨勪俊浠跺凡緇忔斁鍒頒綘鐨勫涓簡錛佽侀檲寰堥珮鍏達(dá)紝鍥犱負(fù)浠栦笉蹇呭啀浜茶嚜鏀跺彂淇′歡浜嗭紒</p> <p>Overlapped I/O 浜嬩歡閫氱煡妯″瀷鍜學(xué)SAEventSelect妯″瀷鍦ㄥ疄鐜頒笂闈炲父鐩鎬技錛屼富瑕佸尯鍒湪“Overlapped”錛孫verlapped妯″瀷鏄搴旂敤紼嬪簭浣跨敤閲嶅彔鏁版嵁緇撴瀯(WSAOVERLAPPED)錛屼竴嬈℃姇閫掍竴涓垨澶氫釜Winsock I/O璇鋒眰銆傝繖浜涙彁浜ょ殑璇鋒眰瀹屾垚鍚庯紝搴旂敤紼嬪簭浼?xì)鏀跺埌閫氱煡銆備粈涔堟剰鎬濆憿錛熷氨鏄錛屽鏋滀綘鎯充粠socket涓婃帴鏀舵暟鎹紝鍙渶瑕佸憡璇夌郴緇燂紝鐢辯郴緇熶負(fù)浣犳帴鏀舵暟鎹紝鑰屼綘闇瑕佸仛鐨勫彧鏄負(fù)緋葷粺鎻愪緵涓涓紦鍐插尯~~~~~<br>Listen綰跨▼鍜學(xué)SAEventSelect妯″瀷涓妯′竴鏍鳳紝Recv/Send綰跨▼鍒欏畬鍏ㄤ笉鍚岋細(xì)</p> <p><br>Code<br>procedure TOverlapThread.Execute;<br>var<br>dwTemp : DWORD;<br>ret    : Integer;<br>Index : DWORD;<br>begin<br></p> <p>while ( not Terminated ) do<br>begin<br>    Index := WSAWaitForMultipleEvents( FLinks.Count, @FLinks.Events[0], FALSE, RECV_TIME_OUT, FALSE );<br>    Dec( Index, WSA_WAIT_EVENT_0 );<br>    if Index > WSA_MAXIMUM_WAIT_EVENTS-1 then {//瓚呮椂鎴栬呭叾浠栭敊璇瘆<br>       continue;</p> <p>    WSAResetEvent( FLinks.Events[Index] );<br>    WSAGetOverlappedResult( FLinks.Sockets[Index], FLinks.pOverlaps[Index], @dwTemp, FALSE, FLinks.pdwFlags[Index]^ );</p> <p>    if dwTemp = 0 then {//榪炴帴宸茬粡鍏抽棴}<br>    begin<br>      <br>      continue;<br>    end else<br>    begin<br>      fmMain.ListBox1.Items.Add( FLinks.pBufs[Index]^.buf );<br>    end;</p> <p>    {//鍒濆鍖栫紦鍐插尯}<br>    FLinks.pdwFlags[Index]^ := 0;<br>    FillChar( FLinks.pOverlaps[Index]^, sizeof(WSAOVERLAPPED), 0 );<br>    FLinks.pOverlaps[Index]^.hEvent := FLinks.Events[Index];<br>    FillChar( FLinks.pBufs[Index]^.buf^, BUFFER_SIZE, 0 );</p> <p>    {//閫掍竴涓帴鏀舵暟鎹姹倉<br>    WSARecv( FLinks.Sockets[Index], FLinks.pBufs[Index], 1, FLinks.pdwRecvd[Index]^, FLinks.pdwFlags[Index]^, FLinks.pOverlaps[Index], nil );<br>end;<br>end;</p> <p>浜旓細(xì)Overlapped I/O 瀹屾垚渚嬬▼妯″瀷</p> <p>鑰侀檲鎺ユ敹鍒版柊鐨勪俊浠跺悗錛屼竴鑸殑紼嬪簭鏄細(xì)鎵撳紑淇″皝----鎺忓嚭淇$焊----闃呰淇′歡----鍥炲淇′歡......涓轟簡榪涗竴姝ュ噺杞葷敤鎴瘋礋鎷咃紝寰蔣鍙堝紑鍙戜簡涓縐嶆柊鐨勬妧鏈細(xì)鐢ㄦ埛鍙鍛婅瘔寰蔣瀵逛俊浠剁殑鎿嶄綔姝ラ錛屽井杞俊綆卞皢鎸夌収榪欎簺姝ラ鍘誨鐞嗕俊浠訛紝涓嶅啀闇瑕佺敤鎴蜂翰鑷媶淇?闃呰/鍥炲浜嗭紒鑰侀檲緇堜簬榪囦笂浜嗗皬璧勭敓媧伙紒</p> <p>Overlapped I/O 瀹屾垚渚嬬▼瑕佹眰鐢ㄦ埛鎻愪緵涓涓洖璋冨嚱鏁幫紝鍙戠敓鏂扮殑緗戠粶浜嬩歡鐨勬椂鍊欑郴緇熷皢鎵ц榪欎釜鍑芥暟錛?/p> <p><br>procedure WorkerRoutine( const dwError, cbTransferred : DWORD; const<br>          lpOverlapped : LPWSAOVERLAPPED; const dwFlags : DWORD ); stdcall;</p> <p>鐒跺悗鍛婅瘔緋葷粺鐢╓orkerRoutine鍑芥暟澶勭悊鎺ユ敹鍒扮殑鏁版嵁錛?br>WSARecv( m_socket, @FBuf, 1, dwTemp, dwFlag, @m_overlap, WorkerRoutine );<br>鐒跺悗......娌℃湁浠涔堢劧鍚庝簡錛岀郴緇熶粈涔堥兘緇欎綘鍋氫簡錛佸井杞湡瀹炰綋璐達(dá)紒</p> <p><br>Code<br>while ( not Terminated ) do{//榪欏氨鏄竴涓猂ecv/Send綰跨▼瑕佸仛鐨勪簨鎯呬粈涔堥兘涓嶇敤鍋氬晩錛侊紒錛亇<br>begin<br>if SleepEx( RECV_TIME_OUT, True ) = WAIT_IO_COMPLETION then {//}<br>begin<br>    ;<br>end else<br>begin<br>    continue;<br>end;<br>end;</p> <p> </p> <p>鍏細(xì)IOCP妯″瀷</p> <p>寰蔣淇$浼間箮寰堝畬緹庯紝鑰侀檲涔熷緢婊℃剰銆備絾鏄湪涓浜涘ぇ鍏徃鎯呭喌鍗村畬鍏ㄤ笉鍚岋紒榪欎簺澶у叕鍙告湁鏁頒互涓囪鐨勪俊綆憋紝姣忕閽熼兘鏈夋暟浠ョ櫨璁$殑淇′歡闇瑕佸鐞嗭紝浠ヨ嚦浜庡井杞俊綆辯粡甯稿洜瓚呰礋鑽瘋繍杞屽穿婧冿紒闇瑕侀噸鏂板惎鍔紒寰蔣涓嶅緱涓嶄嬌鍑烘潃鎵嬮攺......<br>寰蔣緇欐瘡涓ぇ鍏徃媧句簡涓鍚嶅悕鍙?#8220;Completion Port”鐨勮秴綰ф満鍣ㄤ漢錛岃榪欎釜鏈哄櫒浜哄幓澶勭悊閭d簺淇′歡錛?/p> <p>“Windows NT灝忕粍娉ㄦ剰鍒拌繖浜涘簲鐢ㄧ▼搴忕殑鎬ц兘娌℃湁棰勬枡鐨勯偅涔堥珮銆傜壒鍒殑錛屽鐞嗗緢澶氬悓鏃剁殑瀹㈡埛璇鋒眰鎰忓懗鐫寰堝綰跨▼騫跺彂鍦拌繍琛屽湪緋葷粺涓傚洜涓烘墍鏈夎繖浜涚嚎紼嬮兘鏄彲榪愯鐨刐娌℃湁琚寕璧峰拰絳夊緟鍙戠敓浠涔堜簨]錛孧icrosoft鎰忚瘑鍒癗T鍐呮牳鑺辮垂浜嗗お澶氱殑鏃墮棿鏉ヨ漿鎹㈣繍琛岀嚎紼嬬殑涓婁笅鏂嘯Context]錛岀嚎紼嬪氨娌℃湁寰楀埌寰堝CPU鏃墮棿鏉ュ仛瀹冧滑鐨勫伐浣溿傚ぇ瀹跺彲鑳戒篃閮芥劅瑙夊埌騫惰妯″瀷鐨勭摱棰堝湪浜庡畠涓烘瘡涓涓鎴瘋姹傞兘鍒涘緩浜嗕竴涓柊綰跨▼銆傚垱寤虹嚎紼嬫瘮璧峰垱寤鴻繘紼嬪紑閿瑕佸皬錛屼絾涔熻繙涓嶆槸娌℃湁寮閿鐨勩傛垜浠笉濡ㄨ鎯充竴涓嬶細(xì)濡傛灉浜嬪厛寮濂絅涓嚎紼嬶紝璁╁畠浠湪閭old[鍫靛]錛岀劧鍚庡彲浠ュ皢鎵鏈夌敤鎴風(fēng)殑璇鋒眰閮芥姇閫掑埌涓涓秷鎭槦鍒椾腑鍘匯傜劧鍚庨偅N涓嚎紼嬮愪竴浠庢秷鎭槦鍒椾腑鍘誨彇鍑烘秷鎭茍鍔犱互澶勭悊銆傚氨鍙互閬垮厤閽堝姣忎竴涓敤鎴瘋姹傞兘寮綰跨▼銆備笉浠呭噺灝戜簡綰跨▼鐨勮祫婧愶紝涔熸彁楂樹簡綰跨▼鐨勫埄鐢ㄧ巼銆傜悊璁轟笂寰堜笉閿欙紝浣犳兂鎴戠瓑娉涙硾涔嬭緢閮借兘鎯沖嚭鏉ョ殑闂錛孧icrosoft鍙堟庝細(xì)娌℃湁鑰冭檻鍒板憿?”-----鎽樿嚜nonocast鐨勩婄悊瑙/O Completion Port銆?/p> <p>鍏堢湅涓涓婭OCP妯″瀷鐨勫疄鐜幫細(xì)</p> <p><br>Code<br>{鍒涘緩涓涓畬鎴愮鍙<br>FCompletPort := CreateIoCompletionPort( INVALID_HANDLE_VALUE, 0,0,0 );</p> <p>{鎺ュ彈榪滅▼榪炴帴錛屽茍鎶婅繖涓繛鎺ョ殑socket鍙ユ焺緇戝畾鍒板垰鎵嶅垱寤虹殑IOCP涓妢<br>AConnect := accept( FListenSock, addr, len);<br>CreateIoCompletionPort( AConnect, FCompletPort, nil, 0 );</p> <p>{鍒涘緩CPU鏁?2 + 2涓嚎紼媫<br>for i:=1 to si.dwNumberOfProcessors*2+2 do<br>begin<br>AThread := TRecvSendThread.Create( false );<br>AThread.CompletPort := FCompletPort;{//鍛婅瘔榪欎釜綰跨▼錛屼綘瑕佸幓榪欎釜IOCP鍘昏闂暟鎹畗<br>end;</p> <p>OK錛屽氨榪欎箞綆鍗曪紝鎴戜滑瑕佸仛鐨勫氨鏄緩绔嬩竴涓狪OCP錛屾妸榪滅▼榪炴帴鐨剆ocket鍙ユ焺緇戝畾鍒板垰鎵嶅垱寤虹殑IOCP涓婏紝鏈鍚庡垱寤簄涓嚎紼嬶紝騫跺憡璇夎繖n涓嚎紼嬪埌榪欎釜IOCP涓婂幓璁塊棶鏁版嵁灝卞彲浠ヤ簡銆?/p> <p>鍐嶇湅涓涓婽RecvSendThread綰跨▼閮藉共浜涗粈涔堬細(xì)</p> <p><br>Code<br>procedure TRecvSendThread.Execute;<br>var<br><br>begin<br>while (not self.Terminated) do<br>begin<br>    {鏌ヨIOCP鐘舵侊紙鏁版嵁璇誨啓鎿嶄綔鏄惁瀹屾垚錛墋<br>    GetQueuedCompletionStatus( CompletPort, BytesTransd, CompletKey, POVERLAPPED(pPerIoDat), TIME_OUT );</p> <p>    if BytesTransd <> 0 then<br>       .;{//鏁版嵁璇誨啓鎿嶄綔瀹屾垚}</p> <p>    {//鍐嶆姇閫掍竴涓鏁版嵁璇鋒眰}<br>    WSARecv( CompletKey, @(pPerIoDat^.BufData), 1, BytesRecv, Flags, @(pPerIoDat^.Overlap), nil );<br>end;<br>end;</p> <p>璇誨啓綰跨▼鍙槸綆鍗曞湴媯(gè)鏌OCP鏄惁瀹屾垚浜嗘垜浠姇閫掔殑璇誨啓鎿嶄綔錛屽鏋滃畬鎴愪簡鍒欏啀鎶曢掍竴涓柊鐨勮鍐欒姹傘?br>搴旇娉ㄦ剰鍒幫紝鎴戜滑鍒涘緩鐨勬墍鏈塗RecvSendThread閮藉湪璁塊棶鍚屼竴涓狪OCP錛堝洜涓烘垜浠彧鍒涘緩浜嗕竴涓狪OCP錛夛紝騫朵笖鎴戜滑娌℃湁浣跨敤涓寸晫鍖猴紒闅鵑亾涓嶄細(xì)浜х敓鍐茬獊鍚楋紵涓嶇敤鑰冭檻鍚屾闂鍚楋紵<br>鍛靛懙錛岃繖姝f槸IOCP鐨勫ゥ濡欐墍鍦ㄣ侷OCP涓嶆槸涓涓櫘閫氱殑瀵硅薄錛屼笉闇瑕佽冭檻綰跨▼瀹夊叏闂銆傚畠浼?xì)鑷姩璋冮厤璁块棶瀹冪殑绾拷E嬶細(xì)濡傛灉鏌愪釜socket涓婃湁涓涓嚎紼婣姝e湪璁塊棶錛岄偅涔堢嚎紼婤鐨勮闂姹備細(xì)琚垎閰嶅埌鍙﹀涓涓猻ocket銆傝繖涓鍒囬兘鏄敱緋葷粺鑷姩璋冮厤鐨勶紝鎴戜滑鏃犻渶榪囬棶銆?/p> <p>鍛靛懙錛岀粓浜庡啓瀹屼簡錛屽ソ绱?.....浠ヤ笂鎵鏈夌殑婧愪唬鐮佸彲浠ヤ粠榪欓噷鐪嬪埌錛?br><a ><u><font color=#0066cc>http://community.csdn.net/Expert/topic/3844/3844679.xml?temp=5.836123E-02</font></u></a><br>涓嶈繃浠g爜鍐欑殑寰堢畝闄嬶紝璇峰鍖呮兜錛?/p> <p>杞嚜錛?a ><u><font color=#0066cc>http://blog.csdn.net/flyinwuhan/</font></u></a></p> <p><u><font color=#0066cc></font></u></p> <p>澹版槑錛氶櫎CSDN澶栫殑浠諱綍濯掍綋杞澆蹇呴』娉ㄦ槑浣滆呬互鍙?#8220;杞澆鑷狢SDN”銆?/p> <p> </p> </div> <img src ="http://www.shnenglu.com/elva/aggbug/131764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">鍙跺瓙</a> 2010-10-29 17:12 <a href="http://www.shnenglu.com/elva/archive/2010/10/29/131764.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>wincap涓枃鐗堢炕璇?<杞?gt;http://www.shnenglu.com/elva/archive/2008/10/07/63368.html鍙跺瓙鍙跺瓙Tue, 07 Oct 2008 02:11:00 GMThttp://www.shnenglu.com/elva/archive/2008/10/07/63368.htmlhttp://www.shnenglu.com/elva/comments/63368.htmlhttp://www.shnenglu.com/elva/archive/2008/10/07/63368.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/63368.htmlhttp://www.shnenglu.com/elva/services/trackbacks/63368.html涓嶇敤loopback鎹曡幏鏁版嵁鎶?
榪欒妭鐨勪緥瀛愬緢璞″厛鍓嶇殑涓绔狅紙鑾峰緱緗戝崱鐨勯珮綰т俊鎭級(jí)浣嗘槸榪欎竴鑺備腑鏄敤pcap_next_ex()鏉ヤ唬鏇縫cap_loop()鏉ユ崟鑾鋒暟鎹寘銆傚熀浜庡洖璋冨寘鎹曡幏鏈哄埗

鐨刾cap_loop()鍦ㄦ煇浜涙儏鍐典笅鏄笉閿欑殑閫夋嫨銆備絾鏄湪涓浜涙儏鍐典笅澶勭悊鍥炶皟騫朵笉鐗瑰埆濂斤細(xì)榪欎細(xì)浣跨▼搴忓彉鐨勫鏉傚茍涓斿湪璞″綰跨▼鎴朇++綾昏繖浜涙儏鍐典笅

瀹冪湅璧鋒潵鍒拌薄涓鍧楃粖鑴氱煶銆?/p>

鍦ㄨ繖浜涙儏鍐典笅pcap_next_ex()鍏佽鐩存帴璋冪敤鏉ユ帴鏀跺寘錛屽畠鐨勫弬鏁板拰pcap_loop()鐩稿悓錛氭湁涓涓綉鍗℃弿榪板壇錛屽拰涓や釜鎸囬拡錛岃繖涓や釜鎸囬拡浼?xì)琚垵濮嬪?/p>

騫惰繑鍥炵粰鐢ㄦ埛錛屼竴涓槸pcap_pkthdr緇撴瀯錛屽彟涓涓槸鎺ユ敹鏁版嵁鐨勭紦鍐插尯銆備笅闈㈢殑紼嬪簭鎴戦棬灝嗗驚鐜皟鐢ㄥ墠涓鑺傜殑渚嬪瓙涓殑鍥炴帀閮ㄥ垎錛屽彧鏄妸瀹冪Щ鍒?/p>

浜唌ain閲岄潰浜嗐?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include "pcap.h"


main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
int res;
char errbuf[PCAP_ERRBUF_SIZE];
struct tm *ltime;
char timestr[16];
struct pcap_pkthdr *header;
u_char *pkt_data;


/* Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the adapter */
if ( (adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode
1000, // read timeout
errbuf // error buffer
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

printf("\nlistening on %s...\n", d->description);

/* At this point, we don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* 姝ゅ寰幆璋冪敤 pcap_next_ex鏉ユ帴鍙楁暟鎹姤*/
while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){

if(res == 0)
/* Timeout elapsed */
continue;

/* convert the timestamp to readable format */
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
}

if(res == -1){
printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
return -1;
}

return 0;
}

娉細(xì)pcap_next_ex()鍙湪Win32鐜涓嬫墠琛屽洜涓哄畠涓嶆槸鍘熷libpcap API涓殑涓閮ㄥ垎錛岃繖灝辨剰鍛崇潃渚濊禆浜庤繖涓嚱鏁扮殑浠g爜涓嶄細(xì)鍦║NIX涓嬪伐浣溿傞偅

涔堜負(fù)浠涔堟垜浠敤pcap_next_ex()鑰屼笉鐢╬cap_next()錛熷洜涓簆cap_next()鏈夎澶氶檺鍒跺湪寰堝鎯呭喌涓嬪茍涓嶉紦鍔辯敤瀹冦傞鍏堝畠鐨勬晥鐜囧緢浣庡洜涓哄畠闅愯棌

浜嗗洖鎺夋柟娉曞茍涓旇繕渚濊禆浜巔cap_dispatch()榪欎釜鍑芥暟銆傚啀嬈″畠涓嶈兘澶熻瘑鍒枃浠剁粨鏉熸爣蹇桬OF鎵浠ュ鏉ヨ嚜鏂囦歡鐨勬暟鎹祦瀹冨嚑涔庢棤鑳戒負(fù)鍔涖?br>娉ㄦ剰褰損cap_next_ex()鍦ㄦ垚鍔燂紝瓚呮椂錛屽嚭閿欏拰鏂囦歡緇撴潫鐨勬儏鍐典笅浼?xì)杩斿洖涓嶅悓鐨勫?br>

浜旓級(jí)鏁版嵁嫻佺殑榪囨護(hù)

WinPcap鎴杔ibpca鏈寮哄ぇ鐨勭壒鐐逛箣涓灝辨槸鏁版嵁嫻佺殑榪囨護(hù)寮曟搸銆傚畠鎻愪緵涓縐嶉珮鏁堢殑鏂規(guī)硶鏉ュ彧鎹曡幏緗戠粶鏁版嵁嫻佺殑鏌愪簺鏁版嵁鑰屼笖甯稿父鍜岀郴緇熺殑鎹曡幏鏈哄埗

鐩擱泦鎴愩傝繃婊ゆ暟鎹殑鍑芥暟鏄痯cap_compile() 鍜?pcap_setfilter()鏉ュ疄鐜扮殑銆?/p>


pcap_compile()鏉ョ紪璇戜竴涓繃婊よ澶囷紝瀹冮氳繃涓涓珮灞傜殑boolean鍨嬪彉閲忓拰瀛椾覆浜х敓涓緋誨垪鐨勮兘澶熻搴曞眰椹卞姩鎵瑙i噴鐨勪簩榪涘埗緙栫爜銆俠oolean琛?/p>

紺鴻娉曡兘澶熷湪榪欎釜鏂囦歡鐨勮繃婊よ〃紺鴻娉曚腑鎵懼埌銆?/p>

pcap_setfilter() 鐢ㄦ潵鑱旂郴涓涓湪鍐呮牳椹卞姩涓婅繃婊ょ殑榪囨護(hù)鍣紝榪欐椂鎵鏈夌綉緇滄暟鎹寘閮藉皢嫻佺粡榪囨護(hù)鍣紝騫舵嫹璐濆埌搴旂敤紼嬪簭涓?/p>

涓嬮潰鐨勪唬鐮佸睍紺轟簡濡備綍緙栬瘧騫剁ぞ瀹氫竴涓繃婊よ澶囥傛敞鎰忔垜浠繀欏諱粠pcap_if緇撴瀯涓幏寰楁帺鐮侊紝鍥犱負(fù)涓浜涜繃婊ゅ櫒鐨勫垱寤洪渶瑕佽繖涓弬鏁般?/p>

涓嬮潰鐨勪唬鐮佹涓殑pcap_compile()鐨?ip and tcp"鍙傛暟璇存槑鍙湁IPV4鍜孴CP鏁版嵁鎵嶄細(xì)琚唴鏍鎬繚瀛樺茍琚紶閫掑埌搴旂敤紼嬪簭銆?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
if(d->addresses != NULL)
/* 鑾峰緱絎竴涓帴鍙e湴鍧鐨勬帺鐮?*/
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
/* 濡傛灉榪欎釜鎺ュ彛娌℃湁鍦板潃閭d箞鎴戜滑鍋囪浠栦負(fù)C綾誨湴鍧 */
netmask=0xffffff;


//compile the filter
if(pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) <0 ){
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

//set the filter
if(pcap_setfilter(adhandle, &fcode)<0){
fprintf(stderr,"\nError setting the filter.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

   
鍏級(jí)瑙f瀽鏁版嵁鍖?br>鐜板湪緇忚繃涓婂嚑鑺傜殑瀛︿範(fàn)鑳藉榪涜鏁版嵁鎶ョ殑鎹曡幏鍜岃繃婊や簡錛屾垜浠兂鐢ㄤ竴涓畝鍗曠殑"real world"紼嬪簭灝嗘垜浠墍瀛︾殑

鐭ヨ瘑搴旂敤浜庡疄闄呫?br>榪欎竴鑺傞噷鎴戜滑灝嗗埄鐢ㄤ互鍓嶇殑浠g爜騫跺皢鍏跺紩鐢充粠鑰屽緩绔嬩竴涓洿瀹炵敤鐨勭▼搴忋傝紼嬪簭鐨勪富瑕佺洰鐨勬槸濡備綍鏄劇ず鍑烘墍鎹?/p>

鑾風(fēng)殑鏁版嵁鎶ョ殑鍐呭錛屽挨鍏舵槸瀵瑰畠鐨勫崗璁ご鐨勫垎鏋愬拰璇存槑銆傝繖涓▼搴忓悕鍙玌DPdump瀹冨皢鍦ㄥ睆騫曚笂鏄劇ず鍑烘垜浠綉緇滀笂

UDP鏁版嵁鐨勪俊鎭?br>鍦ㄦ鎴戜滑閫夋嫨瑙f瀽UDP鑰屼笉鐢═CP鍥犱負(fù)浠栨瘮TCP綆鍗曟洿鍔犵殑鐩磋鏄庝簡銆備笅闈㈣鎴戜滑鏉ョ湅鐪嬪師浠g爜銆?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
/*
* Copyright (c) 1999 - 2002
* Politecnico di Torino. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the Politecnico
* di Torino, and its contributors.‘‘ Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS‘‘ AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

#include "pcap.h"

/* 4 BIT鐨処P澶村畾涔?*/
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;

/* IPv4 澶寸殑瀹氫箟 */
typedef struct ip_header{
u_char ver_ihl; // 4 bit鐨勭増鏈俊鎭?+ 4 bits鐨勫ご闀?br>u_char tos; // TOS綾誨瀷
u_short tlen; // 鎬婚暱搴?br>u_short identification; // Identification
u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char ttl; // 鐢熷瓨鏈?br>u_char proto; // 鍚庨潰鐨勫崗璁俊鎭?br>u_short crc; // 鏍¢獙鍜?br>ip_address saddr; // 婧怚P
ip_address daddr; // 鐩殑IP
u_int op_pad; // Option + Padding
}ip_header;

/* UDP header*/
typedef struct udp_header{
u_short sport; // Source port
u_short dport; // Destination port
u_short len; // Datagram length
u_short crc; // Checksum
}udp_header;

/* 瀹氫箟澶勭悊鍖呯殑鍑芥暟 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);


main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip and udp";
struct bpf_program fcode;

/* Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the adapter */
if ( (adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on

all the MACs.
1, // promiscuous mode
1000, // read timeout
errbuf // error buffer
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* Check the link layer. We support only Ethernet for simplicity. */
if(pcap_datalink(adhandle) != DLT_EN10MB)
{
fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

if(d->addresses != NULL)
/* Retrieve the mask of the first address of the interface */
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
/* If the interface is without addresses we suppose to be in a C class network */
netmask=0xffffff;


//compile the filter
if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 ){
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

//set the filter
if(pcap_setfilter(adhandle, &fcode)<0){
fprintf(stderr,"\nError setting the filter.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

printf("\nlistening on %s...\n", d->description);

/* At this point, we don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* start the capture */
pcap_loop(adhandle, 0, packet_handler, NULL);

return 0;
}

/* Callback function invoked by libpcap for every incoming packet */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport,dport;

/* convert the timestamp to readable format */
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

/* print timestamp and length of the packet */
printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

/* 鎵懼埌IP澶寸殑浣嶇疆 */
ih = (ip_header *) (pkt_data +
14); //14涓轟互澶ご鐨勯暱搴?/p>

/* 鎵懼埌UDP鐨勪綅緗?*/
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *) ((u_char*)ih + ip_len);

/* 灝嗙鍙d俊鎭粠緗戠粶鍨嬭漿鍙樹負(fù)涓繪満欏哄簭 */
sport = ntohs( uh->sport );
dport = ntohs( uh->dport );

/* print ip addresses and udp ports */
printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
sport,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4,
dport);
}

 

棣栧厛鎴戦棬璁劇疆UDP榪囨護(hù)錛岀敤榪欑鏂規(guī)硶鎴戜滑紜繚packet_handler()鍙帴鍙楀埌鍩轟簬IPV4鐨刄DP鏁版嵁銆傛垜浠悓鏍峰畾涔変簡

涓や釜鏁版嵁緇撴瀯鏉ユ弿榪癐P 鍜孶DP鐨勫ご閮ㄤ俊鎭紝packet_handler()鐢ㄨ繖涓や釜緇撴瀯鏉ュ畾浣嶅ご閮ㄧ殑鍚勭瀛楁銆?br>packet_handler()铏界劧鍙槸闄愪簬澶勭悊涓浜沀DP鏁版嵁浣嗗嵈鏄劇ず浜嗗鏉傜殑鍡呮帰鍣ㄥtcpdump/WinDump鐨勫伐浣滃師鐞嗐?br>棣栧厛鎴戜滑瀵筂AC鍦板潃鐨勫ご閮ㄥ茍涓嶆劅鍏磋叮鎵浠ユ垜浠煩榪囧畠銆備笉榪囧湪寮濮嬫崟鑾蜂箣鍓嶆垜浠敤pcap_datalink()鏉ユ鏌AC

灞傦紝鎵浠ヤ互涓婄殑紼嬪簭鍙兘澶熷伐浣滃湪Ethernet networks涓婏紝鍐嶆鎴戜滑紜繚MAC澶翠負(fù)14 bytes銆?br>MAC澶翠箣鍚庢槸IP澶達(dá)紝鎴戜滑浠庝腑鎻愬彇鍑轟簡鐩殑鍦板潃銆侷P涔嬪悗鏄疷DP錛屽湪紜畾UDP鐨勪綅緗椂鏈夌偣澶嶆潅錛屽洜涓篒P鐨勯暱搴︿互

涓虹増鏈殑涓嶅悓鑰屼笉鍚岋紝鎵浠ユ垜浠敤澶撮暱瀛楁鏉ュ畾浣峌DP錛屼竴鏃?鎴戜滑紜畾浜哢DP鐨勮搗濮嬩綅緗紝鎴戜滑灝卞彲浠ヨВ鏋愬嚭鍘?/p>

鍜岀洰鐨勭鍙c?br>涓嬮潰鏄垜浠墦鍗板嚭鏉ョ殑涓浜涚粨鏋滐細(xì)

1. {A7FD048A-5D4B-478E-B3C1-34401AC3B72F} (Xircom t 10/100 Adapter)
Enter the interface number (1-2):1

listening on Xircom CardBus Ethernet 10/100 Adapter...
16:13:15.312784 len:87 130.192.31.67.2682 -> 130.192.3.21.53
16:13:15.314796 len:137 130.192.3.21.53 -> 130.192.31.67.2682
16:13:15.322101 len:78 130.192.31.67.2683 -> 130.192.3.21.53

涓婇潰姣忎竴琛岄兘鏄劇ず鍑轟笉鍚岀殑鏁版嵁鍖呯殑鍐呭.

  
錛堜竷錛夊鐞嗚劚鏈虹殑鍫嗘枃浠?/p>

閫氳繃浠ュ墠鐨勫涔?fàn)鎴戦棬宸簿l忕啛鎮(zhèn)変簡浠庣綉鍗′笂鎹曡幏鏁版嵁鍖咃紝鐜板湪鎴戦棬灝嗗涔?fàn)濡備綍澶勭悊鏁版嵁鍖呫俉INPCAP涓烘垜浠彁渚涗簡寰堝API鏉ュ皢嫻佺粡緗戠粶鐨勬暟鎹寘

淇濆瓨鍒頒竴涓爢鏂囦歡騫惰鍙栧爢鐨勫唴瀹廣傝繖涓鑺傚皢璁茶堪濡備綍浣跨敤鎵鏈夌殑榪欎簺API銆?br>榪欑鏂囦歡鐨勬牸寮忓緢綆鍗曪紝浣嗗寘鍚簡鎵鎹曡幏鐨勬暟鎹姤鐨勪簩榪涘埗鍐呭錛岃繖縐嶆枃浠舵牸寮忎篃鏄緢澶氱綉緇滃伐鍏風(fēng)殑鏍囧噯濡俉inDump, Ethereal 榪樻湁 Snort絳?


鍏充簬濡備綍灝嗘暟鎹寘淇濆瓨鍒版枃浠訛細(xì)

棣栧厛鎴戜滑鐪嬬湅濡備綍浠IBPCAP鐨勬牸寮忓啓鏁版嵁鍖呫?br>涓嬮潰鐨勪緥瀛愭紨紺轟簡濡備綍浠庢寚瀹氱殑鎺ュ彛涓婃崟鑾鋒暟鎹寘騫跺皢瀹冧滑瀛樺偍鍒頒竴涓寚瀹氱殑鏂囦歡銆?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include "pcap.h"

/* 瀹氫箟澶勭悊鏁版嵁鐨勫嚱鏁板師褰?*/
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main(int argc, char **argv)
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;//瀹氫箟鏂囦歡鍙ユ焺
char errbuf[PCAP_ERRBUF_SIZE];
pcap_dumper_t *dumpfile;

 

/* 媯(gè)鏌ュ懡浠よ鍙傛暟 鏄惁甯︽湁鏂囦歡鍚?/
if(argc != 2){

printf("usage: %s filename", argv[0]);
return -1;

}

/* 鑾峰緱椹卞姩鍒楄〃 */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 鎵撳嵃 list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* 璺寵漿鍒版寚瀹氱殑緗戝崱 */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the adapter */
if ( (adhandle = pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode
1000, // read timeout
errbuf // error buffer
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* 鎵撳紑鏂囦歡 */
dumpfile = pcap_dump_open(adhandle, argv[1]);
if(dumpfile==NULL){
fprintf(stderr,"\nError opening output file\n");
return -1;
}

printf("\nlistening on %s...\n", d->description);

/* At this point, we don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* 寰幆鎹曡幏鏁版嵁騫惰皟鐢╬acket_handler鍑芥暟鎶婃暟鎹瓨鍌ㄥ埌鍫嗘枃浠?*/
pcap_loop(adhandle, 0, packet_handler, (unsigned char *)dumpfile);

return 0;
}

/* Callback function invoked by libpcap for every incoming packet */

void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
/* 姝ゅ嚱鏁板姛鑳藉皢鏁版嵁鎶ュ瓨鍌ㄥ埌鍫嗘枃浠?*/
pcap_dump(dumpfile, header, pkt_data);
}

 

姝e浣犵湅鍒扮殑閭f牱璇ョ▼搴忕殑緇撴瀯闈炲父綾諱技涓庝互鍓嶇殑渚嬪瓙錛屽尯鍒槸錛?br>涓鏃︽墦寮緗戝崱灝辮皟鐢╬cap_dump_open()鏉ユ墦寮涓涓枃浠訛紝璇ヨ皟鐢ㄥ皢鏂囦歡鍜屾煇涓綉鍗$浉鍏寵仈銆?br>packet_handler()鍐呴儴閫氳繃璋冪敤pcap_dump()鏉ュ皢鎹曡幏鐨勬暟鎹姤瀛樺偍鍒版枃浠躲俻cap_dump()鐨勫弬鏁板拰 packet_handler()涓鏍鳳紝鎵浠ョ敤璧鋒潵姣旇緝鏂?/p>

渚褲?/p>

浠庢枃浠惰鏁版嵁鍖咃細(xì)

涓嬮潰鎴戜滑鏉ョ湅濡備綍浠庢枃浠惰鍙栨暟鎹唴瀹廣備笅闈㈢殑浠g爜鎵撳紑浜?涓涓爢鏂囦歡騫舵墦鍗頒簡鍏朵腑鐨勬瘡涓寘鍐呭銆?br>pcap_open_offline()鐢ㄦ潵鎵撳紑涓涓爢鏂囦歡錛屼箣鍚庣敤pcap_loop()鏉ュ驚鐜粠鏂囦歡涓鍙栨暟鎹備綘鑳藉彂鐜拌鍙栬劚鏈虹殑鏁版嵁鍑犱箮鍜屽疄鏃剁殑浠庣綉鍗′笂璇?/p>

鍙栦竴鎽鎬竴鏍楓?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include <stdio.h>
#include <pcap.h>

#define LINE_LEN 16

void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);

main(int argc, char **argv) {

pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];


if(argc != 2){

printf("usage: %s filename", argv[0]);
return -1;

}

/* 鎵撳紑涓涓瓨鍌ㄦ湁鏁版嵁鐨勫爢鏂囦歡 */
if ( (fp = pcap_open_offline(argv[1], errbuf) ) == NULL)
{
fprintf(stderr,"\nError opening dump file\n");
return -1;
}

// 璇誨彇鏁版嵁鐩村埌閬囧埌 EOF鏍囧織銆?
pcap_loop(fp, 0, dispatcher_handler, NULL);

return 0;
}

 

void dispatcher_handler(u_char *temp1,
const struct pcap_pkthdr *header, const u_char *pkt_data)
{
u_int i=0;

/* print pkt timestamp and pkt len */
printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);

/* Print the packet */
for (i=1; (i < header->caplen + 1 ) ; i++)
{
printf("%.2x ", pkt_data[i-1]);
if ( (i % LINE_LEN) == 0) printf("\n");
}

printf("\n\n");

}

 

涓嬮潰鐨勪唬鐮佸叿鏈変竴鏍風(fēng)殑浣滅敤錛屽彧涓嶈繃鏄敤pcap_next_ex()鏉ヤ唬鏇縫cap_loop()寰幆璇誨彇鏁版嵁鑰屽凡銆?/p>


紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include <stdio.h>
#include <pcap.h>

#define LINE_LEN 16

main(int argc, char **argv) {

pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr *header;
u_char *pkt_data;
u_int i=0;
int res;

if(argc != 2){

printf("usage: %s filename", argv[0]);
return -1;

}

/* Open a capture file */
if ( (fp = pcap_open_offline(argv[1], errbuf) ) == NULL)
{
fprintf(stderr,"\nError opening dump file\n");
return -1;
}

/* Retrieve the packets from the file */
while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0){
/* print pkt timestamp and pkt len */
printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);

/* Print the packet */
for (i=1; (i < header->caplen + 1 ) ; i++)
{
printf("%.2x ", pkt_data[i-1]);
if ( (i % LINE_LEN) == 0) printf("\n");
}

printf("\n\n");
}


if(res == -1){
printf("Error reading the packets: %s\n", pcap_geterr(fp));
}

return 0;
}


鐢╬cap_live_dump灝嗘暟鎹啓鍒版枃浠訛細(xì)
WinPcap鐨勬渶鏂扮増鏈彁渚涗簡涓涓繘涓姝ョ殑鏂規(guī)硶鏉ュ皢鏁版嵁鍖呭瓨鍌ㄥ埌紓佺洏錛屽氨鏄嬌鐢╬cap_live_dump()鍑芥暟銆備粬闇瑕佷笁涓弬鏁幫細(xì)涓涓枃浠跺悕錛屽拰涓涓?/p>

璇ユ枃浠跺厑璁哥殑鏈澶ч暱搴﹁繕鏈変竴涓弬鏁版槸璇ユ枃浠舵墍鍏佽鐨勬渶澶у寘鐨勬暟閲忋傚榪欎簺鍙傛暟鏉ヨ 0 鎰忓懗鐫娌℃湁鏈澶ч檺鍒躲傛敞錛氭垜浠彲浠ュ湪璋冪敤

pcap_live_dump()鍓嶈緗竴涓繃婊ゅ櫒鏉ュ畾涔夊摢浜涙暟鎹姤闇瑕佸瓨鍌ㄣ?/p>

pcap_live_dump() 鏄潪闃誨鐨勶紝鎵浠ヤ粬浼?xì)绔嬪埢杩斿洖锛?xì)鏁版嵁鐨勫瓨鍌ㄨ繃紼嬪皢浼?xì)寮傛鐨剺q涜錛岀洿鍒版枃浠跺埌杈句簡鎸囧畾鐨勬渶澶ч暱搴︽垨鏈澶ф暟鎹姤鐨勬暟鐩負(fù)

姝€?br>搴旂敤紼嬪簭鑳藉鐢╬cap_live_dump_ended()鏉ョ瓑媯(gè)鏌ユ槸鍚︽暟鎹瓨鍌ㄥ畬姣曪紝濡傛灉浣犳寚瀹氱殑鏈澶ч暱搴﹀弬鏁板拰鏁版嵁鎶ユ暟閲忎負(fù)0錛岄偅涔堣鎿嶄綔灝嗘案榪滈樆濉炪?/p>

pcap_live_dump() 鍜?pcap_dump()鐨勪笉鍚屼粠璁劇疆鐨勬渶澶ф瀬闄愭潵璇村氨鏄ц兘鐨勯棶棰樸俻cap_live_dump()閲囩敤WinPcap NPF椹卞姩鏉ヤ粠鍐呮牳綰х殑灞傛

涓婂悜鏂囦歡涓啓鏁版嵁錛屼粠鑰屼嬌鍐呭瓨鎷瘋礉鏈灝忓寲銆?br>鏄劇劧錛岃繖浜涚壒鐐瑰綋鍓嶅湪鍏朵粬鐨勬搷浣滅郴緇熶笅鏄笉鑳藉瀹炵幇鐨勶紝pcap_live_dump()鏄疻inPcap鎵鐗規(guī)湁鐨勶紝鑰屼笖鍙兘澶熷簲鐢ㄤ簬Win32鐜.

   
鍏級(jí)鍙戦佹暟鎹寘

灝界WinPcap浠庡悕瀛椾笂鏉ョ湅琛ㄦ槑浠栫殑涓昏鐩殑鏄崟鑾鋒暟鎹寘錛屼絾鏄粬榪樹負(fù)鍘熷緗戠粶鎻愪緵浜嗕竴浜涘叾浠栫殑鍔熻兘錛屽叾涓?/p>

涔嬩竴灝辨槸鐢ㄦ埛鍙互鍙戦佹暟鎹寘錛岃繖涔熷氨鏄湰鑺傜殑涓昏鍐呭銆傞渶瑕佹寚鍑虹殑鏄師鏉ョ殑libpcap騫朵笉鎻愪緵鏁版嵁鍖?鐨勫彂

閫佸姛鑳斤紝榪欓噷鎵璇寸殑鍔熻兘閮芥槸WinPcap鐨勬墿灞曞姛鑳斤紝鎵浠ュ茍涓嶈兘澶熷伐浣滃湪UNIX涓嬨?/p>

鐢╬cap_sendpacket鏉ュ彂閫佷竴涓暟鎹寘錛?/p>

涓嬮潰鐨勪唬鐮佹槸涓涓渶綆鍗曠殑鍙戦佹暟鎹殑鏂規(guī)硶銆傛墦寮涓涓傞厤鍣ㄥ悗灝卞彲浠ョ敤 pcap_sendpacket錛堬級(jí)鏉ユ墜宸ュ彂閫佷竴

涓暟鎹寘浜嗐傝繖涓嚱鏁伴渶瑕佺殑鍙傛暟錛氫竴涓鏈夎鍙戦佹暟鎹殑緙撳啿鍖猴紝瑕佸彂閫佺殑闀垮害錛屽拰涓涓傞厤鍣ㄣ傛敞鎰忕紦鍐?/p>

鍖轟腑鐨勬暟鎹皢涓嶈鍐呮牳鍗忚澶勭悊錛屽彧鏄綔涓烘渶鍘熷鐨勬暟鎹祦琚彂閫侊紝鎵浠ユ垜闂ㄥ繀欏誨~鍏呭ソ姝g‘鐨勫崗璁ご浠ヤ究姝?/p>

紜殑灝嗘暟鎹彂閫併?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include <stdlib.h>
#include <stdio.h>

#include <pcap.h>

void usage();

void main(int argc, char **argv) {
pcap_t *fp;
char error[PCAP_ERRBUF_SIZE];
u_char packet[100];
int i;

/* Check the validity of the command line */
if (argc != 2)
{
printf("usage: %s inerface", argv[0]);
return;
}

/* 鎵撳紑鎸囧畾緗戝崱 */
if((fp = pcap_open_live(argv[1], 100, 1, 1000, error) ) == NULL)
{
fprintf(stderr,"\nError opening adapter: %s\n", error);
return;
}

/* 鍋囪緗戠粶鐜涓篹thernet錛屾垜闂ㄦ妸鐩殑MAC璁句負(fù)1:1:1:1:1:1*/
packet[0]=1;
packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;

/* 鍋囪婧怣AC涓?2:2:2:2:2:2 */
packet[6]=2;
packet[7]=2;
packet[8]=2;
packet[9]=2;
packet[10]=2;
packet[11]=2;

/* 濉厖鍙戦佸寘鐨勫墿浣欓儴鍒?*/
for(i=12;i<100;i++){
packet[i]=i%256;
}

/* 鍙戦佸寘 */
pcap_sendpacket(fp,
packet,
100);

return;
}

 

鍙戦侀槦鍒楋細(xì)
pcap_sendpacket()鍙槸鎻愪緵涓涓畝鍗曠殑鐩存帴鐨勫彂閫佹暟鎹殑鏂規(guī)硶錛岃屽彂閫侀槦鍒楁彁渚涗竴涓珮綰х殑寮哄ぇ鐨勫拰鏈浼樼殑鏈?/p>

鍒舵潵鍙戦佷竴緇勬暟鎹寘錛岄槦鍒楀疄闄呬笂鏄竴涓鏈夎鍙戦佹暟鎹殑涓涓鍣紝浠栨湁涓涓渶澶у兼潵琛ㄦ槑浠栨墍鑳藉 瀹圭撼鐨?/p>

鏈澶ф瘮鐗規(guī)暟銆?br>pcap_sendqueue_alloc()鐢ㄦ潵鍒涘緩涓涓槦鍒楋紝騫舵寚瀹氳闃熷垪鐨勫ぇ灝忋?br>涓鏃﹂槦鍒楄鍒涘緩灝卞彲浠ヨ皟鐢╬cap_sendqueue_queue()鏉ュ皢鏁版嵁瀛樺偍鍒伴槦鍒椾腑錛岃繖涓嚱鏁版帴鍙椾竴涓甫鏈夋椂闂存埑鍜?/p>

闀垮害鐨刾cap_pkthdr緇撴瀯鍜屼竴涓鏈夋暟鎹姤鐨勭紦鍐插尯銆傝繖浜涘弬鏁板悓鏍蜂篃搴旂敤浜巔cap_next_ex() 鍜?/p>

pcap_handler()涓紝鎵浠ョ粰瑕佹崟鑾風(fēng)殑鏁版嵁鍖呮垨瑕佷粠鏂囦歡璇誨彇鐨勬暟鎹寘鎺掗槦灝辨槸pcap_sendqueue_queue()鐨勪簨鎯?/p>

浜嗐?br>WinPcap璋冪敤pcap_sendqueue_transmit()鏉ュ彂閫佹暟鎹寘錛屾敞鎰忥紝絎笁涓弬鏁板鏋滈潪闆訛紝閭d箞鍙戦佸皢鏄悓姝ョ殑錛?/p>

榪欏皢绔欑敤寰堝ぇ鐨凜PU璧勬簮錛屽洜涓哄彂鐢熷湪鍐呮牳椹卞姩鐨勫悓姝ュ彂閫佹槸閫氳繃"brute force"loops鐨勶紝浣嗘槸涓鑸儏鍐典笅鑳藉

綺劇‘鍒板井縐掋?br>闇瑕佹寚鍑虹殑鏄敤pcap_sendqueue_transmit()鏉ュ彂閫佹瘮鐢╬cap_sendpacket()鏉ュ彂閫佷竴緋誨垪鐨勬暟鎹楂樻晥鐨勫錛?/p>

鍥犱負(fù)浠栫殑鏁版嵁鏄湪鍐呮牳綰т笂琚紦鍐層?br>褰撲笉鍐嶉渶瑕侀槦鍒楁椂鍙互鐢╬cap_sendqueue_destroy()鏉ラ噴鏀炬帀鎵鏈夌殑闃熷垪璧勬簮銆?/p>

涓嬮潰鐨勪唬鐮佹紨紺轟簡濡備綍鐢ㄥ彂閫侀槦鍒楁潵鍙戦佹暟鎹紝璇ョず渚嬬敤pcap_open_offline()鎵撳紑浜嗕竴涓枃浠訛紝鐒跺悗灝嗘暟鎹?/p>

浠庢枃浠剁Щ鍔ㄥ埌宸插垎閰嶇殑闃熷垪錛岃繖鏃跺氨鍚屾鍦頒紶閫侀槦鍒楋紙濡傛灉鐢ㄦ埛鎸囧畾涓哄悓姝ョ殑璇濓級(jí)銆?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
/*
* Copyright (c) 1999 - 2002
* Politecnico di Torino. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the Politecnico
* di Torino, and its contributors.‘‘ Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS‘‘ AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <stdlib.h>
#include <stdio.h>

#include <pcap.h>

void usage();

void main(int argc, char **argv) {
pcap_t *indesc,*outdesc;
char error[PCAP_ERRBUF_SIZE];
FILE *capfile;
int caplen,
sync;
u_int res;
pcap_send_queue *squeue;
struct pcap_pkthdr *pktheader;
u_char *pktdata;

/* Check the validity of the command line */
if (argc <= 2 || argc >= 5)
{
usage();
return;
}

/* 寰楀埌鏂囦歡闀垮害 */
capfile=fopen(argv[1],"rb");
if(!capfile){
printf("Capture file not found!\n");
return;
}

fseek(capfile , 0, SEEK_END);
caplen= ftell(capfile)- sizeof(struct pcap_file_header);
fclose(capfile);

/* 媯(gè)鏌ョ‘淇濇椂闂存埑琚拷鐣?*/
if(argc == 4 && argv[3][0] == ‘s‘)
sync = TRUE;
else
sync = FALSE;

/* Open the capture */
if((indesc = pcap_open_offline(argv[1], error)) == NULL){
fprintf(stderr,"\nError opening the input file: %s\n", error);
return;
}

/* Open the output adapter */
if((outdesc = pcap_open_live(argv[2], 100, 1, 1000, error) ) == NULL)
{
fprintf(stderr,"\nError opening adapter: %s\n", error);
return;
}

/* 媯(gè)嫻婱AC綾誨瀷 */
if(pcap_datalink(indesc) != pcap_datalink(outdesc)){
printf("Warning: the datalink of the capture differs from the one of the selected

interface.\n");
printf("Press a key to continue, or CTRL+C to stop.\n");
getchar();
}

/* 緇欏鍒楀垎閰嶇┖闂?*/
squeue = pcap_sendqueue_alloc(caplen);

/* 浠庢枃浠惰幏寰楀寘鏉ュ~鍏呴槦鍒?*/
while((res = pcap_next_ex( indesc, &pktheader, &pktdata)) == 1){
if(pcap_sendqueue_queue(squeue, pktheader, pktdata) == -1){
printf("Warning: packet buffer too small, not all the packets will be sent.\n");
break;
}
}

if(res == -1){
printf("Corrupted input file.\n");
pcap_sendqueue_destroy(squeue);
return;
}

/* 浼犻侀槦鍒楁暟鎹?*/

if((res = pcap_sendqueue_transmit(outdesc, squeue, sync)) < squeue->len)
{
printf("An error occurred sending the packets: %s. Only %d bytes were sent\n", error,

res);
}

/* free the send queue */
pcap_sendqueue_destroy(squeue);

return;
}


void usage()
{

printf("\nSendcap, sends a libpcap/tcpdump capture file to the net. Copyright (C) 2002 Loris

Degioanni.\n");
printf("\nUsage:\n");
printf("\t sendcap file_name adapter [s]\n");
printf("\nParameters:\n");
printf("\nfile_name: the name of the dump file that will be sent to the network\n");
printf("\nadapter: the device to use. Use \"WinDump -D\" for a list of valid devices\n");
printf("\ns: if present, forces the packets to be sent synchronously, i.e. respecting the

timestamps in the dump file. This option will work only under Windows NTx.\n\n");

exit(0);
}

   
涔?jié)锛?jí)鏀墮泦騫剁粺璁$綉緇滄祦閲?br>榪欎竴鑺傚皢灞曠ずWinPcap鐨勫彟涓楂樼駭鍔熻兘錛氭敹闆嗙綉緇滄祦閲忕殑緇熻淇℃伅銆俉inPcap鐨勭粺璁″紩鎿庡湪鍐呮牳灞傛涓婂鍒版潵鐨勬暟鎹繘琛屽垎綾匯傚鏋滀綘鎯充簡瑙f洿

澶氱殑緇嗚妭璇鋒煡鐪婲PF椹卞姩鎸囧崡銆?br>涓轟簡鍒╃敤榪欎釜鍔熻兘鏉ョ洃瑙嗙綉緇滐紝鎴戦棬鐨勭▼搴忓繀欏繪墦寮涓涓綉鍗″茍鐢╬cap_setmode()灝嗗叾璁劇疆涓虹粺璁℃ā寮忋傛敞鎰弍cap_setmode()瑕佺敤 MODE_STAT

鏉ュ皢緗戝崱璁劇疆涓虹粺璁℃ā寮忋?br>鍦ㄧ粺璁℃ā寮忎笅緙栧啓涓涓▼搴忔潵鐩戣TCP嫻侀噺鍙槸鍑犺浠g爜鐨勪簨鎯咃紝涓嬮潰鐨勪緥瀛愯鏄庝簡濡備綍鏉ュ疄鐜拌鍔熻兘鐨勩?
紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
/*
* Copyright (c) 1999 - 2002
* Politecnico di Torino. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the Politecnico
* di Torino, and its contributors.‘‘ Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS‘‘ AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <stdlib.h>
#include <stdio.h>

#include <pcap.h>

void usage();

void dispatcher_handler(u_char *,
const struct pcap_pkthdr *, const u_char *);


void main(int argc, char **argv) {
pcap_t *fp;
char error[PCAP_ERRBUF_SIZE];
struct timeval st_ts;
u_int netmask;
struct bpf_program fcode;

/* Check the validity of the command line */
if (argc != 2)
{
usage();
return;
}

/* Open the output adapter */
if((fp = pcap_open_live(argv[1], 100, 1, 1000, error) ) == NULL)
{
fprintf(stderr,"\nError opening adapter: %s\n", error);
return;
}

/* Don‘t care about netmask, it won‘t be used for this filter */
netmask=0xffffff;

//compile the filter
if(pcap_compile(fp, &fcode, "tcp", 1, netmask) <0 ){
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* Free the device list */
return;
}

//set the filter
if(pcap_setfilter(fp, &fcode)<0){
fprintf(stderr,"\nError setting the filter.\n");
/* Free the device list */
return;
}

/* 灝嗙綉鍗¤緗負(fù)緇熻妯″紡 */
pcap_setmode(fp, MODE_STAT);

printf("TCP traffic summary:\n");

/* Start the main loop */
pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);

return;
}

void dispatcher_handler(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct timeval *old_ts = (struct timeval *)state;
u_int delay;
LARGE_INTEGER Bps,Pps;
struct tm *ltime;
char timestr[16];

/* 浠庢渶榪戜竴嬈$殑閲囨牱浠ュ井縐掕綆楀歡榪熸椂闂?*/
/* This value is obtained from the timestamp that the associated with the sample. */
delay=(header->ts.tv_sec - old_ts->tv_sec) * 1000000 - old_ts->tv_usec + header->ts.tv_usec;
/* 鑾峰緱姣忕鐨勬瘮鐗規(guī)暟 */
Bps.QuadPart=(((*(LONGLONG*)(pkt_data + 8)) * 8 * 1000000) / (delay));
/* ^ ^
| |
| |
| |
converts bytes in bits -- |
|
delay is expressed in microseconds --
*/

/* 鑾峰緱姣忕鐨勬暟鎹寘鏁?*/
Pps.QuadPart=(((*(LONGLONG*)(pkt_data)) * 1000000) / (delay));

/* 灝嗘椂闂存埑杞彉涓哄彲璇葷殑鏍囧噯鏍煎紡 */
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

/* Print timestamp*/
printf("%s ", timestr);

/* Print the samples */
printf("BPS=%I64u ", Bps.QuadPart);
printf("PPS=%I64u\n", Pps.QuadPart);

//store current timestamp
old_ts->tv_sec=header->ts.tv_sec;
old_ts->tv_usec=header->ts.tv_usec;
}


void usage()
{

printf("\nShows the TCP traffic load, in bits per second and packets per second.\nCopyright (C) 2002 Loris Degioanni.\n");
printf("\nUsage:\n");
printf("\t tcptop adapter\n");
printf("\t You can use \"WinDump -D\" if you don‘t know the name of your adapters.\n");

exit(0);
}

 

鍦ㄨ緗負(fù)緇熻妯″紡鍓嶅彲浠ヨ緗竴涓繃婊ゅ櫒鏉ユ寚瀹氳鎹曡幏鐨勫崗璁寘銆傚鏋滄病鏈夎緗繃婊ゅ櫒閭d箞鏁翠釜緗戠粶鏁版嵁閮藉皢琚洃瑙嗐備竴鏃﹁緗簡 榪囨護(hù)鍣ㄥ氨鍙?/p>

浠ヨ皟鐢╬cap_setmode()鏉ヨ緗負(fù)緇熻妯″紡錛屼箣鍚庣綉鍗″紑濮嬪伐浣滃湪緇熻妯″紡涓嬨?br>闇瑕佹寚鍑虹殑鏄痯cap_open_live()鐨勭鍥涗釜鍙傛暟(to_ms)瀹氫箟浜嗛噰鏍風(fēng)殑闂撮殧錛屽洖璋冨嚱鏁皃cap_loop()姣忛殧涓瀹氶棿闅斿氨鑾峰彇涓嬈¢噰鏍風(fēng)粺璁★紝榪欎釜閲囨牱

琚鍏cap_loop()鐨勭浜屽拰絎笁涓弬鏁幫紝榪囩▼濡備笅鍥炬墍紺猴細(xì)
______________
|struct timeval ts |
|_____________|
|bpf_u_int32 |
|caplen=16 | struct pcap_pkthdr*
|_____________| (鍙傛暟2)
| bpf_u_int32 |
| len=16 |
|_____________|

__________________________
|large_integer Accepted packet |
|_________________________| uchar *
| large_integer Accepted bits | (鍙傛暟3)
|_________________________|

 

鐢ㄤ袱涓?4浣嶇殑璁℃暟鍣ㄥ垎鍒褰曟渶榪戜竴嬈¢棿闅旀暟鎹寘鏁伴噺鍜屾瘮鐗規(guī)暟閲忋?br>鏈緥瀛愪腑錛岀綉鍗℃墦寮鏃惰緗秴鏃朵負(fù)1000姣錛屼篃灝辨槸璇磀ispatcher_handler()姣忛殧1縐掑氨琚皟鐢ㄤ竴嬈°傝繃婊ゅ櫒涔?/p>

璁劇疆涓哄彧鐩戣TCP鍖咃紝鐒跺悗pcap_setmode() and pcap_loop()琚皟鐢紝娉ㄦ剰涓涓寚鍚憈imeval鐨勬寚閽?浣滀負(fù)鍙傛暟浼?/p>

閫佸埌pcap_loop()銆傝繖涓猼imeval緇撴瀯灝嗙敤鏉ュ瓨鍌ㄤ釜鏃墮棿鎴充互璁$畻涓ゆ閲囨牱鐨勬椂闂撮棿闅斻?br>dispatcher_handler()鐢ㄨ闂撮殧鏉ヨ幏鍙栨瘡縐掔殑姣旂壒鏁板拰鏁版嵁鍖呮暟錛屽茍鎶婄潃涓や釜鏁版樉紺哄湪鏄劇ず鍣ㄤ笂銆?br>鏈鍚庢寚鍑虹殑鏄洰鍓嶈繖涓緥瀛愭槸姣斾換浣曚竴涓埄鐢ㄤ紶緇熸柟娉曞湪鐢ㄦ埛灞傜粺璁$殑鍖呮崟鑾風(fēng)▼搴忛兘楂樻晥銆傚洜涓虹粺璁℃ā寮忛渶瑕?/p>

鏈灝忔暟閲忕殑鏁版嵁鎷瘋礉鍜屼笂涓嬬幆澧冧氦鎹紝鍚屾椂榪樻湁鏈灝忕殑鍐呭瓨闇姹傦紝鎵浠PU鏄渶浼樼殑銆?/p>

鍙跺瓙 2008-10-07 10:11 鍙戣〃璇勮
]]>
wincap涓枃鐗堢炕璇?lt;杞?gt;http://www.shnenglu.com/elva/archive/2008/10/07/63367.html鍙跺瓙鍙跺瓙Tue, 07 Oct 2008 02:08:00 GMThttp://www.shnenglu.com/elva/archive/2008/10/07/63367.htmlhttp://www.shnenglu.com/elva/comments/63367.htmlhttp://www.shnenglu.com/elva/archive/2008/10/07/63367.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/63367.htmlhttp://www.shnenglu.com/elva/services/trackbacks/63367.htmlwincap涓枃鐗堢炕璇?br>錛堜竴錛夊緱鍒扮綉緇滈┍鍔ㄥ垪琛?/p>

鐢≒CAP鍐欏簲鐢ㄧ▼搴忕殑絎竴浠朵簨寰寰灝辨槸瑕佽幏寰楁湰鍦扮殑緗戝崱鍒楄〃銆侾CAP鎻愪緵浜唒cap_findalldevs()榪欎釜鍑芥暟鏉ュ疄鐜版鍔熻兘錛岃繖涓狝PI榪斿洖涓涓?/p>

pcap_if緇撴瀯鐨勮繛琛紝榪炶〃鐨勬瘡欏瑰唴瀹歸兘鍚湁鍏ㄩ潰鐨勭綉鍗′俊鎭細(xì)灝ゅ叾鏄瓧孌靛悕瀛楀拰鍚湁鍚嶅瓧鐨勬弿榪頒互鍙?qiáng)鏈夊叧椹卞姩鍣ㄧ殑鏄撹M俊鎭?/p>

寰楀埌緗戠粶椹卞姩鍒楄〃鐨勭▼搴忓涓嬶細(xì)

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]

 


#include "pcap.h"

main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];

/* 榪欎釜API鐢ㄦ潵鑾峰緱緗戝崱 鐨勫垪琛?*/
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 鏄劇ず鍒楄〃鐨勫搷搴斿瓧孌電殑鍐呭 */
for(d=alldevs;d;d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
}

/* We don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);
}
[code]鏈夊叧榪欐紼嬪簭鐨勪竴浜涜鏄庯細(xì)
棣栧厛pcap_findalldevs()鍚屽叾浠栫殑libpcap鍑芥暟涓鏍鋒湁涓涓猠rrbuf鍙傛暟錛屽綋鏈夊紓甯告儏鍐靛彂鐢熸椂錛岃繖涓弬鏁頒細(xì)琚玃CAP濉厖涓烘煇涓壒瀹氱殑閿欒瀛椾覆銆?/p>

鍐嶆錛孶NIX涔熷悓鏍鋒彁渚沺cap_findalldevs()榪欎釜鍑芥暟錛屼絾鏄娉ㄦ剰騫墮潪鎵鏈夌殑緋葷粺閮芥敮鎸乴ibpcap鎻愪緵鐨勭綉緇滅▼搴忔帴鍙c傛墍浠ユ垜闂ㄨ鎯沖啓鍑哄悎閫?/p>

鐨勭▼搴忓氨蹇呴』鑰冭檻鍒拌繖浜涙儏鍐碉紙緋葷粺涓嶈兘澶熻繑鍥炰竴浜涘瓧孌電殑鎻忚堪淇℃伅錛夛紝鍦ㄨ繖縐嶆儏鍐典笅鎴戦棬搴旇緇欏嚭綾諱技"No description available"榪欐牱鐨?/p>

鎻愮ず銆?/p>

鏈鍚庣粨鏉熸椂鍒繕浜嗙敤pcap_freealldevs()閲婃斁鎺夊唴瀛樿祫婧愩?/p>

[code]#include "pcap.h"

main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];

/* Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* Print the list */
for(d=alldevs;d;d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
}

/* We don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);
}

 

 

 


浜岋級(jí)鑾峰緱宸插畨瑁呯綉緇滈┍鍔ㄥ櫒鐨勯珮綰т俊鎭?/p>

鍦ㄧ涓绔犱腑婕旂ず浜嗗浣曡幏寰楀凡瀛樺湪閫傞厤鍣ㄧ殑闈欐佷俊鎭傚疄闄呬笂WinPcap鍚屾牱涔熸彁渚涘叾浠栫殑楂樼駭淇℃伅錛岀壒鍒槸 pcap_findalldevs()榪欎釜鍑芥暟榪斿洖

鐨勬瘡涓?pcap_if緇撴瀯浣撻兘鍚屾牱鍖呭惈涓涓猵cap_addr緇撴瀯鐨勫垪琛紝浠栧寘鍚細(xì)
涓涓湴鍧鍒楄〃錛屼竴涓帺鐮佸垪琛紝涓涓箍鎾湴鍧鍒楄〃鍜屼竴涓洰鐨勫湴鍧鍒楄〃銆?br>涓嬮潰鐨勪緥瀛愰氳繃涓涓猧fprint()鍑芥暟鎵撳嵃鍑轟簡pcap_if緇撴瀯鐨勭殑鎵鏈夊瓧孌典俊鎭紝璇ョ▼搴忓姣忎竴涓猵cap_findalldevs()鎵榪斿洖鐨刾cap_if緇撴瀯寰幆璋?/p>

鐢╥fprint()鏉ユ樉紺鴻緇嗙殑瀛楁淇℃伅銆?/p>

紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include "pcap.h"
#ifndef WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#else
#include <winsock.h>
#endif

void ifprint(pcap_if_t *d);
char *iptos(u_long in);

int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE+1];

/* 鑾峰緱緗戝崱鐨勫垪琛?*/
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
exit(1);
}

/* 寰幆璋冪敤ifprint() 鏉ユ樉紺簆cap_if緇撴瀯鐨勪俊鎭?/
for(d=alldevs;d;d=d->next)
{
ifprint(d);
}

return 1;
}

/* Print all the available information on the given interface */
void ifprint(pcap_if_t *d)
{
pcap_addr_t *a;

/* Name */
printf("%s\n",d->name);

/* Description */
if (d->description)
printf("\tDescription: %s\n",d->description);

/* Loopback Address*/
printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

/* IP addresses */
for(a=d->addresses;a;a=a->next) {
printf("\tAddress Family: #%d\n",a->addr->sa_family);

/*鍏充簬 sockaddr_in 緇撴瀯璇峰弬鑰冨叾浠栫殑緗戠粶緙栫▼涔?/
switch(a->addr->sa_family)
{
case AF_INET:
printf("\tAddress Family Name: AF_INET\n");//鎵撳嵃緗戠粶鍦板潃綾誨瀷
if (a->addr)//鎵撳嵃IP鍦板潃
printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
if (a->netmask)//鎵撳嵃鎺╃爜
printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
if (a->broadaddr)//鎵撳嵃騫挎挱鍦板潃
printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
if (a->dstaddr)//鐩殑鍦板潃
printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
break;
default:
printf("\tAddress Family Name: Unknown\n");
break;
}
}
printf("\n");
}

/* 灝嗕竴涓猽nsigned long 鍨嬬殑IP杞崲涓哄瓧絎︿覆綾誨瀷鐨処P */
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
static char output[IPTOSBUFFERS][3*4+3+1];
static short which;
u_char *p;

p = (u_char *)&in;
which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return output[which];
}

   

 

涓夛級(jí)鎵撳紑緗戝崱鎹曡幏鏁版嵁鍖?/p>


鐜板湪鎴戦棬宸茬粡鐭ラ亾浜嗗浣曞幓鑾峰緱緗戝崱鐨勪俊鎭幇鍦ㄥ氨璁╂垜浠紑濮嬬湡姝g殑宸ヤ綔錛氭墦寮緗戝崱騫舵崟鑾鋒暟鎹祦銆傚湪榪欎竴鑺?/p>

閲屾垜浠皢鍐欎竴涓墦鍗版祦緇忕綉緇滅殑姣忎釜鏁版嵁鍖呬俊鎭殑紼嬪簭銆傛墦寮緗戝崱鐨勫姛鑳芥槸閫氳繃pcap_open_live()鏉ュ疄鐜扮殑瀹?/p>

鏈変笁涓弬鏁皊naplen promisc to_ms銆?/p>

snaplen鐢ㄤ簬鎸囧畾鎵鎹曡幏鍖呯殑鐗瑰畾閮ㄥ垎錛屽湪涓浜涚郴緇熶笂錛堣薄xBSD and Win32絳夛級(jí)椹卞姩鍙粰鍑烘墍鎹曡幏鏁版嵁鍖呯殑涓閮ㄥ垎鑰屼笉鏄叏閮紝榪欐牱灝卞噺灝戜簡鎷?/p>

璐濇暟鎹殑鏁伴噺浠庤屾彁楂樹簡鍖呮崟鑾風(fēng)殑鏁堢巼銆?/p>

promisc鎸囨槑緗戝崱澶勪簬娣鋒潅妯″紡錛屽湪姝e父鎯呭喌涓嬬綉鍗″彧鎺ュ彈鍘誨線瀹冪殑鍖呰屽幓寰鍏朵粬涓繪満鐨勬暟鎹寘鍒欒蹇界暐銆傜浉鍙嶅綋緗戝崱澶勪簬娣鋒潅 妯″紡鏃朵粬灝嗘帴

鏀舵墍鏈夌殑嫻佺粡瀹冪殑鏁版嵁鍖咃細(xì)榪欏氨鎰忓懗鐫鍦ㄥ叡浜粙璐ㄧ殑鎯呭喌涓嬫垜闂ㄥ彲浠ユ崟鑾?/p>

鍒板叾瀹冧富鏈虹殑鏁版嵁鍖呫傚ぇ閮ㄥ垎鐨勫寘鎹曡幏紼嬪簭閮藉皢娣鋒潅妯″紡璁句負(fù)榛樿錛屾墍鏈夋垜浠湪涓嬮潰鐨勪緥瀛愰噷涔熷皢緗戝崱璁句負(fù)娣鋒潅妯″紡銆倀o_ms 鍙傛暟鎸囧畾璇繪暟鎹?/p>

鐨勮秴鏃舵帶鍒訛紝瓚呮椂浠ユ縐掕綆椼傚綋鍦ㄨ秴鏃舵椂闂村唴緗戝崱涓婃病鏈夋暟鎹埌鏉ユ椂瀵圭綉鍗$殑璇繪搷浣滃皢榪斿洖錛堝pcap_dispatch() or pcap_next_ex()絳夊嚱鏁?/p>

錛夈傝繕鏈夛紝濡傛灉緗戝崱澶勪簬緇熻妯″紡涓嬶紙璇鋒煡鐪?#8220;緇熻鍜屾敹闆嗙綉緇滄暟鎹祦涓鑺?#8221;錛塼o_ms榪樺畾涔変簡緇熻鐨勬椂闂撮棿闅斻傚鏋滆鍙傛暟涓?閭d箞鎰忓懗鐫娌?/p>

鏈夎秴鏃舵帶鍒訛紝瀵圭綉鍗$殑璇繪搷浣滃湪娌℃湁鏁版嵁鍒版潵鏄皢姘歌繙鍫靛銆傚鏋滀負(fù)-1閭d箞瀵圭綉鍗$殑璇繪搷浣滃皢绔嬪嵆榪斿洖涓嶇鏈夋病鏈夋暟鎹彲璇匯?br>紼嬪簭浠g爜錛?[ 澶嶅埗浠g爜鍒板壀璐存澘 ]
#include "pcap.h"

/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];

/* 鑾峰緱緗戝崱鐨勫垪琛?*/
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 鎵撳嵃緗戝崱淇℃伅 */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum); //杈撳叆瑕侀夋嫨鎵撳紑鐨勭綉鍗″彿

if(inum < 1 || inum > i) //鍒ゆ柇鍙風(fēng)殑鍚堟硶鎬?br>{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

/* 鎵懼埌瑕侀夋嫨鐨勭綉鍗$粨鏋?*/
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* 鎵撳紑閫夋嫨鐨勭綉鍗?*/
if ( (adhandle= pcap_open_live(d->name, // 璁懼鍚嶇О
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // 娣鋒潅妯″紡
1000, // 璇昏秴鏃朵負(fù)1縐?br>errbuf // error buffer
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

printf("\nlistening on %s...\n", d->description);

/* At this point, we don‘t need any more the device list. Free it */
pcap_freealldevs(alldevs);

/* 寮濮嬫崟鑾峰寘 */
pcap_loop(adhandle, 0, packet_handler, NULL);

return 0;
}


/* 瀵規(guī)瘡涓涓埌鏉ョ殑鏁版嵁鍖呰皟鐢ㄨ鍑芥暟 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];

/* 灝嗘椂闂存埑杞彉涓烘槗璇葷殑鏍囧噯鏍煎紡*/
ltime=localtime(&header->ts.tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);

}

 

涓鏃︾綉鍗¤鎵撳紑錛屾棫鍙互璋冪敤pcap_dispatch() 鎴杙cap_loop()榪涜鏁版嵁鐨勬崟鑾鳳紝榪欎袱涓嚱鏁扮殑鍔熻兘鍗佸垎鐩鎬技涓嶅悓鐨勬槸pcap_ dispatch()鍙互涓?/p>

琚樆濉烇紝鑰宲cap_loop()鍦ㄦ病鏈夋暟鎹祦鍒拌揪鏃跺皢闃誨銆傚湪榪欎釜綆鍗曠殑渚嬪瓙閲岀敤pcap_loop()灝辮凍澶熶簡錛岃屽湪涓浜涘鏉傜殑紼嬪簭閲屽線寰鐢?/p>

pcap_dispatch()銆?br>Once the adapter is opened, the capture can be started with pcap_dispatch() or pcap_loop(). These

two functions are very similar, the difference is that pcap_ dispatch() is granted to return when

the expires while pcap_loop() doesn‘t return until cnt packets have been captured, so it can

block for an arbitrary period on a few utilized network. pcap_loop() is enough for the purpose of

this sample, while pcap_dispatch() is normally used in more complex program.
榪欎袱涓嚱鏁伴兘鏈夎繑鍥炵殑鍙傛暟錛屼竴涓寚鍚戞煇涓嚱鏁幫紙璇ュ嚱鏁扮敤鏉ユ帴鍙楁暟鎹璇ョ▼搴忎腑鐨刾acket_handler錛夌殑鎸囬拡錛宭ibpcap璋冪敤璇ュ嚱鏁板姣忎釜浠庣綉

涓婂埌鏉ョ殑鏁版嵁鍖呰繘琛屽鐞嗗拰鎺ユ敹鏁版嵁鍖呫傚彟涓涓弬鏁版槸甯︽湁鏃墮棿鎴沖拰鍖呴暱絳変俊鎭殑澶撮儴錛屾渶鍚庝竴涓槸鍚湁鎵鏈夊崗璁ご閮ㄦ暟鎹姤鐨勫疄闄呮暟鎹傛敞

鎰廙AC鐨勫啑浣欐牎楠岀爜涓鑸笉鍑虹幇錛屽洜涓哄綋涓涓、鍒拌揪騫惰紜鍚庣綉鍗″氨鎶婂畠鍒犻櫎浜嗭紝鍚屾牱闇瑕佹敞鎰忕殑鏄ぇ澶氭暟緗戝崱浼?xì)涓㈡帀鍐椾綑鐮佸嚭閿欑殑鏁版嵁鍖呭Q?/p>

鎵浠inPcap涓鑸笉鑳藉鎹曡幏榪欎簺鍑洪敊鐨勬暟鎹姤銆?/p>

鍒氭墠鐨勪緥瀛愰噷浠巔cap_pkthdr涓彁鍙栧嚭浜嗘瘡涓暟鎹姤鐨勬椂闂存埑鍜岄暱搴﹀茍鍦ㄦ樉紺哄櫒涓婃墦鍗板嚭浜嗕粬浠?br>



鍙跺瓙 2008-10-07 10:08 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久夜色精品国产欧美乱极品| 欧美顶级少妇做爰| 欧美性理论片在线观看片免费| 亚洲精品欧美精品| 亚洲日本电影在线| 欧美激情va永久在线播放| 日韩视频免费观看| 在线一区二区日韩| 国产日韩在线一区二区三区| 久久精品一本久久99精品| 亚洲欧美日韩在线播放| 亚洲午夜激情免费视频| 国产亚洲毛片| 亚洲曰本av电影| 香蕉成人久久| 亚洲激情视频在线播放| 亚洲电影在线免费观看| 欧美三日本三级少妇三2023| 欧美一区二区三区喷汁尤物| 久久噜噜噜精品国产亚洲综合 | 欧美中在线观看| 樱桃成人精品视频在线播放| 亚洲欧洲久久| 国产午夜精品久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美福利视频网站| 欧美日韩网站| 美女性感视频久久久| 欧美人牲a欧美精品| 久久久久久夜精品精品免费| 欧美另类极品videosbest最新版本| 欧美一区二区三区免费观看视频 | 欧美极品色图| 久久久国产成人精品| 欧美日韩国产系列| 欧美不卡一卡二卡免费版| 国产精品vvv| 亚洲高清一区二| 国产一区二区三区久久精品| 99精品福利视频| 亚洲国产欧洲综合997久久| 午夜亚洲影视| 亚洲一区影院| 欧美区在线观看| 欧美激情一二三区| 国产综合色在线| 亚洲综合激情| 在线亚洲自拍| 欧美黄色片免费观看| 快she精品国产999| 国产三级精品三级| 亚洲一区二区三区影院| 国产精品久久综合| 亚洲精品在线免费观看视频| 亚洲精品免费在线观看| 亚洲午夜日本在线观看| 亚洲伦理在线观看| 有坂深雪在线一区| 久久电影一区| 久久精彩免费视频| 久久久九九九九| 亚洲日本欧美天堂| 免费人成网站在线观看欧美高清| 久久激情五月激情| 国产亚洲电影| 欧美一区二区国产| 久久久久亚洲综合| 黄色小说综合网站| 99国产一区二区三精品乱码| 亚洲精品资源美女情侣酒店| 欧美激情乱人伦| 亚洲精品综合久久中文字幕| av成人老司机| 国产精品久久久久婷婷| 亚洲欧美一区二区原创| 久久精品国产一区二区电影| 黑人巨大精品欧美一区二区小视频| 香蕉亚洲视频| 欧美成人一区二区在线 | 国产欧美日本| 久久九九99| 亚洲国产精品成人精品| 99精品国产高清一区二区| 欧美日韩中文在线观看| 亚洲欧美视频| 欧美激情一区二区三区蜜桃视频| 日韩系列欧美系列| 国产精品每日更新| 久久精品成人一区二区三区| 欧美国产先锋| 亚洲欧美欧美一区二区三区| 国产欧美一区二区视频| 美女视频黄 久久| 一区二区高清在线| 久久久久久久久久久久久久一区| 亚洲国产视频直播| 国产精品视频xxx| 久久亚洲精品伦理| 在线亚洲激情| 欧美黄色日本| 欧美一区二区视频免费观看| 亚洲国产免费| 国产欧美韩国高清| 欧美精品免费在线| 久久国产主播精品| 一区二区三区成人 | 一道本一区二区| 国产一区二区精品久久| 欧美久久综合| 久久天天狠狠| 欧美一区二区高清在线观看| 亚洲精品一区二区在线观看| 久久久噜噜噜久噜久久| 亚洲视频网站在线观看| 亚洲国产精品久久久久秋霞影院| 国产精品毛片a∨一区二区三区|国 | 亚洲欧美国产日韩中文字幕| 亚洲国产天堂久久综合网| 欧美一区二区三区在线播放| 亚洲另类自拍| 亚洲电影免费观看高清| 国产一区二区看久久| 亚洲午夜激情网站| 亚洲激情六月丁香| 国产一区二区三区黄| 国产精品豆花视频| 欧美激情二区三区| 久久裸体视频| 久久精品国产一区二区三区| 亚洲欧美区自拍先锋| 亚洲毛片播放| 亚洲日本电影| 亚洲日本中文| 亚洲三级免费电影| 亚洲国产日韩一级| 亚洲高清视频一区| 亚洲第一伊人| 亚洲成人在线视频播放 | 久久国产精品高清| 亚洲伊人色欲综合网| 中文亚洲欧美| 亚洲影视在线| 欧美一区视频| 久久av免费一区| 久久久久综合| 免费久久精品视频| 欧美14一18处毛片| 欧美日韩高清一区| 欧美性久久久| 国产区精品视频| 精品电影在线观看| 亚洲欧洲精品一区| 99亚洲一区二区| 亚洲欧美日韩国产精品| 亚洲一区三区视频在线观看| 小嫩嫩精品导航| 久久精品人人做人人爽电影蜜月| 久久久国产一区二区| 欧美77777| 91久久久久久国产精品| 亚洲最黄网站| 欧美在线视频免费播放| 免费日韩av片| 国产精品99免费看| 国产一区二区三区高清播放| 亚洲国产小视频在线观看| 中文网丁香综合网| 欧美一区二区视频在线| 麻豆av福利av久久av| 亚洲国产婷婷香蕉久久久久久99| 亚洲毛片一区二区| 欧美亚洲免费电影| 欧美寡妇偷汉性猛交| 国产伦精品一区二区三区免费迷| 韩国女主播一区二区三区| 亚洲精品一区二区三区四区高清| 亚洲一区欧美| 女生裸体视频一区二区三区| 亚洲精品欧美在线| 欧美中文字幕第一页| 欧美精品自拍偷拍动漫精品| 国产区亚洲区欧美区| 亚洲毛片网站| 久久久久91| 一区二区三区欧美| 麻豆九一精品爱看视频在线观看免费| 欧美日韩成人综合| 一区二区三区在线视频观看| 亚洲性图久久| 欧美大色视频| 性欧美xxxx大乳国产app| 欧美激情精品| 在线精品观看| 久久国产高清| 国产精品99久久久久久宅男| 蜜桃av综合| 国语自产精品视频在线看一大j8| 这里只有视频精品| 亚洲第一中文字幕在线观看| 销魂美女一区二区三区视频在线|