資源描述:
《windows 2000下的raw socket編程》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、Windows2000下的RawSocket編程Windows2000在TCP/IP協(xié)議組件上做了很多改進,功能也有增強。比如在協(xié)議棧上的調(diào)整,增大了默認窗口大小,以及高延遲鏈接新算法。同時在安全性上,可應用IPSec加強安全性,比NT下有不少的改進。MicrosoftTCP/IP組件包含“核心協(xié)議”、“服務”及兩者之間的“接口”。傳輸驅(qū)動程序接口(TDI)與網(wǎng)絡設備接口規(guī)范(NDIS)是公用的。此外,還有許多用戶模型應用程序的更高級接口。最常用的接口是WindowsSockets、遠程過程調(diào)用(RPC)和NetBIOS。WindowsSockets是一個編程接口,它是在加州大學伯克利
2、分校開發(fā)的套接字接口的基礎上定義的。它包括了一組擴展件,以充分利用MicrosoftWindows消息驅(qū)動的特點。規(guī)范的1.1版是在1993年1月發(fā)行的,2.2.0版在1996年5月發(fā)行。Windows2000支持Winsock2.2版。在Winsock2中,支持多個傳輸協(xié)議的原始套接字,重疊I/O模型、服務質(zhì)量控制等。這里介紹WindowsSockets的一些關于原始套接字(RawSocket)的編程。同Winsock1相比,最明顯的就是支持了RawSocket套接字類型,通過原始套接字,我們可以更加自如地控制Windows下的多種協(xié)議,而且能夠?qū)W(wǎng)絡底層的傳輸機制進行控制。1、創(chuàng)建
3、一個原始套接字,并設置IP頭選項。SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:s=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);這里,我們設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。創(chuàng)建原始套接字后,IP頭就會包含在接收的數(shù)據(jù)中,如果我們設定IP_HDRINCL選項,那么,就需要自己來構造IP頭。注意,如果設置IP_HDRINCL選項,那么必須具有administrator權限,要不就必須修改注冊表:HKEY_LO
4、CAL_MACHINESystemCurrentControlSetServicesAfdParameter修改鍵:DisableRawSecurity(類型為DWORD),把值修改為1。如果沒有,就添加。BOOLblnFlag=TRUE;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&blnFlag,sizeof(blnFlag);對于原始套接字在接收數(shù)據(jù)報的時候,要注意這么幾點:1、如果接收的數(shù)據(jù)報中協(xié)議類型和定義的原始套接字匹配,那么,接收的所有數(shù)據(jù)就拷貝到套接字中。2、如果綁定了本地地址,那么只有接收數(shù)據(jù)IP頭中對應的遠端
5、地址匹配,接收的數(shù)據(jù)就拷貝到套接字中。3、如果定義的是外部地址,比如使用connect(),那么,只有接收數(shù)據(jù)IP頭中對應的源地址匹配,接收的數(shù)據(jù)就拷貝到套接字中。2、構造IP頭和TCP頭這里,提供IP頭和TCP頭的結構://StandardTCPflags#defineURG0x20#defineACK0x10#definePSH0x08#defineRST0x04#defineSYN0x02#defineFIN0x01typedefstruct_iphdr//定義IP首部{unsignedcharh_lenver;//4位首部長度+4位IP版本號unsignedchartos;//
6、8位服務類型TOSunsignedshorttotal_len;//16位總長度(字節(jié))unsignedshortident;//16位標識unsignedshortfrag_and_flags;//3位標志位unsignedcharttl;//8位生存時間TTLunsignedcharproto;//8位協(xié)議(TCP,UDP或其他)unsignedshortchecksum;//16位IP首部校驗和unsignedintsourceIP;//32位源IP地址unsignedintdestIP;//32位目的IP地址}IP_HEADER;typedefstructpsd_hdr//定義
7、TCP偽首部{unsignedlongsaddr;//源地址unsignedlongdaddr;//目的地址charmbz;charptcl;//協(xié)議類型unsignedshorttcpl;//TCP長度}PSD_HEADER;typedefstruct_tcphdr//定義TCP首部{USHORTth_sport;//16位源端口USHORTth_dport;//16位目的端口unsignedintth_seq;//32位序列號unsigne