用C#的Raw Socket實現網路封包監視

來源:互聯網
上載者:User
談起socket編程,大家也許會想起QQ和IE,沒錯。還有許多網路工具如P2P、NetMeeting等在應用程式層實現的應用程式,也是用socket來實現的。Socket是一個網路編程介面,實現於網路應用程式層,Windows Socket包括了一套系統組件,充分利用了Microsoft Windows 訊息驅動的特點。Socket規範1.1版是在1993年1月發行的,並廣泛用於此後出現的Windows9x作業系統中。Socket規範2.2版(其在Windows平台上的版本是Winsock2.2,也叫Winsock2)在 1996 年 5 月發行,Windows NT 5.0及以後版本的Windows系統支援Winsock2,在Winsock2中,支援多個傳輸協議的原始通訊端,重疊I/O模型、服務品質控制等。
  本文向大家介紹Windows Sockets的一些關於用C#實現的原始通訊端(Raw Socket)的編程,以及在此基礎上實現的網路封包監視技術。同Winsock1相比,Winsock2最明顯的就是支援了Raw Socket通訊端類型,使用Raw Socket,可把網卡設定成混雜模式,在這種模式下,我們可以收到網路上的IP包,當然包括目的不是原生IP包,通過原始通訊端,我們也可以更加自如地控制Windows下的多種協議,而且能夠對網路底層的傳輸機制進行控制。
  在本文例子中,我在nbyte.BasicClass命名空間實現了RawSocket類,它包含了我們實現資料包監視的核心技術。在實現這個類之前,需要先寫一個IP頭結構,來暫時存放一些有關網路封包的資訊:
[StructLayout(LayoutKind.Explicit)]
public struct IPHeader
{
[FieldOffset(0)] public byte ip_verlen; //I4位首部長度+4位IP版本號碼
[FieldOffset(1)] public byte ip_tos; //8位服務類型TOS
[FieldOffset(2)] public ushort ip_totallength; //16位元據包總長度(位元組)
[FieldOffset(4)] public ushort ip_id; //16位標識
[FieldOffset(6)] public ushort ip_offset; //3位標誌位
[FieldOffset(8)] public byte ip_ttl; //8位存留時間 TTL
[FieldOffset(9)] public byte ip_protocol; //8位協議(TCP, UDP, ICMP, Etc.)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.