TCP的客戶服務器端口掃描程序設計_第1頁
TCP的客戶服務器端口掃描程序設計_第2頁
TCP的客戶服務器端口掃描程序設計_第3頁
TCP的客戶服務器端口掃描程序設計_第4頁
TCP的客戶服務器端口掃描程序設計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、海南大學信息科學技術(shù)學院安全掃描技術(shù)TCP的客戶/服務器/端口掃描程序設計學號: _姓名: 年級: 2010級 _專業(yè): 信息安全 _指導老師: 顧劍 _目 錄1實驗目的及要求12實驗的背景及意義13實驗流程14實驗內(nèi)容與步驟35實驗代碼55.1 TCP服務器程序:55.2 TCP客戶端:85.3 TCP端口掃描:106實驗操作手冊117實驗總結(jié)141 實驗目的及要求(1)、熟悉Microsoft Visual Studio 2006編程環(huán)境。(2)、了解TCP客戶/服務器/掃描端口的模型原理。 (3)、熟悉Socket編程原理,掌握簡單的套接字編程。2 實驗的背景及意義(1)、TCP客戶和服

2、務器TCP是面向連接的,所謂面向連接,就是當計算機雙方通信時必需先建立連接,然后數(shù)據(jù)傳送,最后拆除連接三個過程 并且TCP在建立連接時又分三步走: 第一步是請求端(客戶端)發(fā)送一個包含SYN即同步(Synchronize)標志的TCP報文,SYN同步報文會指明客戶端使用的端口以及TCP連接的初始序號; 第二步,服務器在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgement)。 第三步,客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。然后才開始通信的第二步:數(shù)據(jù)

3、處理。 這就是所說的TCP三次握手(Three-way Handshake)。 簡單的說就是:(C:客戶端,S:服務端) C:SYN到S S:如成功-返回給C(SYN+ACK) C:如成功-返回給S(ACK) 以上是正常的建立連接方式(2)、TCP端口掃描“端口”在計算機網(wǎng)絡領(lǐng)域中是個非常重要的概念。它是專門為計算機通信而設計的,它不是硬件,不同于計算機中的“插槽”,可以說是個“軟插槽”。如果有需要的話,一臺計算機中可以有上萬個端口。 端口是由TCP/IP協(xié)議定義的。其中規(guī)定,用IP地址和端口作為套接字,它代表TCP連接的一個連接端,一般稱為Socket。具體來說,就是用IP:端口來定位一臺主

4、機中的進程??梢宰鲞@樣的比喻,端口相當于兩臺計算機進程間的大門,可以隨便定義,其目的只是為了讓兩臺計算機能夠找到對方的進程。計算機就像一座大樓,這個大樓有好多入口(端口),進到不同的入口中就可以找到不同的公司(進程)。如果要和遠程主機A的程序通信,那么只要把數(shù)據(jù)發(fā)向A:端口就可以實現(xiàn)通信了。 可見,端口與進程是一一對應的,如果某個進程正在等待連接,稱之為該進程正在監(jiān)聽,那么就會出現(xiàn)與它相對應的端口。由此可見,入侵者通過掃描端口,便可以判斷出目標計算機有哪些通信進程正在等待連接,這也是端口掃描的主要目的。3 實驗流程(1)、TCP客戶程序和服務器程序流程圖程序分兩部分:客戶程序和服務器程序。工作

5、過程是: 服務器首先啟動,它創(chuàng)建套接字之后等待客戶的連接;客戶啟動后創(chuàng)建套接字,然后和服務器建立連接;建立連接后,客戶接收鍵盤輸入,然后將數(shù)據(jù)發(fā)送到服務器,服務器收到到數(shù)據(jù)后,將接收到的字符在屏幕上顯示出來。或者服務器接收鍵盤輸入,然后將數(shù)據(jù)發(fā)送到客戶機,客戶機收到數(shù)據(jù)后,將接收到的字符在屏幕上顯示出來。 服務器方Socket()建立流式套接字,返回套接字號??蛻舴絙ind(),套接字s與本地地址相連。Socket(),建立流失套接字,返回套接字號listen(),通知TCP,服務器準備好接收連接。accept(),接受連接,等待客戶端的連接connect(),將套接字s與遠地主機連接連接建立

6、,accept()返回,得到新的套接字,scsend()/recv(),在套接字上讀/寫數(shù)據(jù),直到數(shù)據(jù)交換完recvt()/send(),在套接字sc上讀/寫數(shù)據(jù),直到數(shù)據(jù)交換完畢closesocket(),關(guān)閉套接字結(jié)束TCP對話closesocket(),關(guān)閉最初套接字s,服務結(jié)束closesocket(),關(guān)閉套接字sc(2)TCP端口掃描流程圖是AfxBeginThread(DoScanPort_TCP,&inforabout,0,0,0,NULL)讀入用戶設置的IP、端口號、協(xié)議開始設置掃描參數(shù)(IP、端口、協(xié)議)開始掃描imaxport初始化進度條i+顯示打開端口i=minport

7、nowAddr=StartAddr否4 實驗內(nèi)容與步驟所用函數(shù)及結(jié)構(gòu)體參考:1、創(chuàng)建套接字socket()功能:使用前創(chuàng)建一個新的套接字格式:SOCKET PASCAL FAR socket(int af, int type, int procotol);參數(shù):af:代表網(wǎng)絡地址族,目前只有一種取值是有效的,即AF_INET,代表internet地址族;Type:代表網(wǎng)絡協(xié)議類型,SOCK_DGRAM代表UDP協(xié)議,SOCK_STREAM代表TCP協(xié)議;Protocol:指定網(wǎng)絡地址族的特殊協(xié)議,目前無用,賦值0即可。返回值為SOCKET,若返回INVALID_SOCKET則失敗。2、指定本地

8、地址bind()功能:將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來。格式:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號)。其它:沒有錯誤,bind()返回0,否則SOCKET_ERROR地址結(jié)構(gòu)說明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口號,網(wǎng)絡字節(jié)順序struct in_addr sin_addr;/32位IP地址,網(wǎng)絡

9、字節(jié)順序char sin_zero8;/保留3、建立套接字連接connect()和accept()功能:共同完成連接工作格式:int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR * name, int FAR * addrlen);參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號)。4、監(jiān)聽連接listen()功能:用于面向連接服務器,表明它愿意接收

10、連接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5、數(shù)據(jù)傳輸send()與recv()功能:數(shù)據(jù)的發(fā)送與接收格式:int PASCAL FAR send(SOCKET s, const char FAR* buf, int len, int flags);int PASCAL FAR recv(SOCKET s, const char FAR * buf, int len, int flags);參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。 6、多路復用select()功能:用來檢測一個或多個套接字狀態(tài)。格式:int PASCAL FAR

11、 select(int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR * exceptfds, const struct timeval FAR* timeout);參數(shù):readfds:指向要做讀檢測的指針writefds:指向要做寫檢測的指針exceptfds:指向要檢測是否出錯的指針timeout:最大等待時間7、關(guān)閉套接字closesocket()功能:關(guān)閉套接字s格式:BOOL PASCAL FAR closesocket (SOCKET s);8、WSADATA類型和LPWSADATA類型WSADATA類型是

12、一個結(jié)構(gòu),描述了Socket庫的一些相關(guān)信息,其結(jié)構(gòu)定義如下:typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA;typedef WSADATA FAR *LPWSADATA;值得注意的就是wVersio

13、n字段,存儲了Socket的版本類型。LPWSADATA是WSADATA的指針類型。它們不用程序員手動填寫,而是通過Socket的初始化函數(shù)WSAStartup讀取出來。9、sockaddr_in、in_addr類型sockaddr_in定義了socket發(fā)送和接收數(shù)據(jù)包的地址。定義:struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8;其中in_addr的定義如下:struct in_addr union struct u_char s_b1,s_b2,s_

14、b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un;首先闡述in_addr的含義,很顯然它是一個存儲ip地址的聯(lián)合體,有三種表達方式:(1)用四個字節(jié)來表示IP地址的四個數(shù)字;(2)用兩個雙字節(jié)來表示IP地址;(3)用一個長整型來表示IP地址。給in_addr賦值的一種最簡單方法是使用inet_addr函數(shù),它可以把一個代表IP地址的字符串賦值轉(zhuǎn)換為in_addr類型,如addrto.sin_addr.s_addr=inet_addr(192.168.0.2);本例子中由于是廣播地址,所以沒有使用這個函數(shù)

15、。其反函數(shù)是inet_ntoa,可以把一個in_addr類型轉(zhuǎn)換為一個字符串。sockaddr_in的含義比in_addr的含義要廣泛,其各個字段的含義和取值如下:第一個字段short sin_family,代表網(wǎng)絡地址族,如前所述,只能取值A(chǔ)F_INET;第二個字段u_short sin_port,代表IP地址端口,由程序員指定;第三個字段structin_addr sin_addr,代表IP地址;第四個字段char sin_zero8,是為了保證sockaddr_in與SOCKADDR類型的長度相等而填充進來的字段。5 實驗代碼5.1 TCP服務器程序:#include #include

16、#include #include #pragma comment (lib, Ws2_32.lib)SOCKET sock1,sock2;/創(chuàng)建套接字-socket()int sin_size ;struct sockaddr_in my_addr,their_addr;/是一個存放協(xié)議族協(xié)議族,端口地址,存儲IP的結(jié)構(gòu),為和sockaddr兼容而保持的補足8字節(jié)char name20;/初始化函數(shù)Tcpvoid Init() const WORD wMinver=0x0101;/固定wMinver的數(shù)值WSADATA wsadata; printf(nnn Server: TCPnnn);

17、/建立套接字if(0!=WSAStartup(wMinver,&wsadata)perror(Start socket error!); if(INVALID_SOCKET=(sock1=socket(AF_INET,SOCK_STREAM,0)perror(Create socket error!);my_addr.sin_family=AF_INET;my_addr.sin_addr.S_un.S_addr=INADDR_ANY;my_addr.sin_port=htons(1000);if(SOCKET_ERROR=bind(sock1,(struct sockaddr*)&my_add

18、r,sizeof(my_addr)/將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來perror(Binding stream socket);exit(1);/開始偵聽if(SOCKET_ERROR=listen(sock1,5)perror(Listening stream socket);exit(1);/接受連接printf( Ready to serve client. Please connect.nnn);sin_size = sizeof(struct sockaddr_in);if(sock2=accept(sock1,(struct sockaddr *)&their_addr,&s

19、in_size)=-1)perror(Accepting stream socket);exit(1); printf( Accepting a new connet:%s,inet_ntoa(their_addr.sin_addr);/選擇菜單int menu()char *s=(char*)malloc(2*sizeof(char);int c;printf(nnn Server: Menunnn);printf( *nn);printf( * 1.Send Message *n);printf( * 2.Receive Message *n);printf( * 3.Exit *nn);

20、printf( *n);doprintf(n Enter your choice:);gets(s);if(s0=0)gets(s);c=atoi(s);while(c3);free(s);return c;/消息發(fā)送函數(shù)void Send()char Msg10240; printf(nPlease Input the message:);gets(Msg); Msg10239=0; send(sock2,Msg,strlen(Msg),0);/消息接收函數(shù)void Receive()int len,i;char buf10240;for(i=0;i10240;i+)bufi=0; if(l

21、en=recv(sock2,buf,10240,0)=-1)perror(Receving data error);exit(1);printf(The Received Message:%sn,buf);/主函數(shù)void main() Init();for(;)switch(menu()case 1:Send();break;case 2:Receive();break;case 3:exit(0);/closesocket(sock2);closesocket(sock1);WSACleanup();5.2 TCP客戶端:#include #include #include #includ

22、e #pragma comment (lib, Ws2_32.lib)SOCKET sock1,sock2;int sin_size ;struct sockaddr_in my_addr,their_addr;char name20;/初始化函數(shù)Tcpvoid Init() const WORD wMinver=0x0101;WSADATA wsadata;char IP16=0; printf(nnn Client: TCPnnn);printf(n 請輸入你要連接的IP地址:);scanf(%s,IP);/建立套接字if(0!=WSAStartup(wMinver,&wsadata)pe

23、rror(Start socket error!); if(INVALID_SOCKET=(sock1=socket(AF_INET,SOCK_STREAM,0)perror(Create socket error!);my_addr.sin_family=AF_INET; my_addr.sin_addr.S_un.S_addr=inet_addr(IP);my_addr.sin_port=htons(1000);/請求連接printf( connecting.);sin_size = sizeof(struct sockaddr_in);if(sock2=(connect(sock1,(L

24、PSOCKADDR)&my_addr,sin_size)=-1)perror(Accepting stream socket);exit(1);/選擇菜單int menu()char *s=(char*)malloc(2*sizeof(char);int c;printf(nnn Client: luoxinnn);printf( *nn);printf( * 1.Send Message *n);printf( * 2.Receive Message *n);printf( * 3.Exit *nn);printf( *n);doprintf(n Enter your choice:);ge

25、ts(s);if(s0=0)gets(s);c=atoi(s);while(c3);free(s);return c;/消息發(fā)送函數(shù)void Send() char Msg10240;printf(nPlease Input the message:);gets(Msg); Msg10239=0; send(sock1,Msg,strlen(Msg),0); /消息接收函數(shù)void Receive()int len,i;char buf10240;for(i=0;i10240;i+)bufi=0; if(len=recv(sock1,buf,10240,0)=-1)perror(Recevin

26、g data error);exit(1);printf(The Received Message:%sn,buf);/主函數(shù)void main() Init();for(;)switch(menu()case 1:Send();break;case 2:Receive();break;case 3:exit(0);closesocket(sock2);closesocket(sock1);WSACleanup();5.3 TCP端口掃描:#include stdafx.h#include #include #pragma comment (lib,ws2_32.lib) int main()

27、 int mysocket,i; /i_端口int pcount = 0; int Min=0,Max=0;char IP16=0;struct sockaddr_in my_addr;/定義一個struct結(jié)構(gòu)WSADATA wsaData; WORD wVersionRequested=MAKEWORD(1,1); /宏創(chuàng)建一個被指定變量連接而成的WORD變量。返回一個WORD變量。if (WSAStartup(wVersionRequested , &wsaData) printf(Winsock Initialization failed.n); exit(1); printf(ple

28、ase input the host you want to scan:n);scanf(%s,IP);printf(please input the min Port you want to scan:n);scanf(%d,&Min);printf(please input the max Port you want to scan:n);scanf(%d,&Max);for(i=Min; iMax; i+) if(mysocket = socket(AF_INET, SOCK_STREAM,0) = INVALID_SOCKET) printf(Socket Error); exit(1

29、); my_addr.sin_family = AF_INET; /代表網(wǎng)絡地址族,目前只有一種取值是有效的,即AF_INET,代表internet地址族;my_addr.sin_port = htons(i); /端口號; Htons函數(shù)是轉(zhuǎn)換結(jié)構(gòu),通常該函數(shù)用于設定socket端口時的轉(zhuǎn)換my_addr.sin_addr.s_addr = inet_addr(IP);/成員sin_addr給出的是套接字的主機IP地址,可以使用函數(shù)inet_addr對點式IP地址進行轉(zhuǎn)換if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(stru

30、ct sockaddr) = SOCKET_ERROR)/Windows Sockets的connect函數(shù)將與一個特定的套接字建立連接,如果調(diào)用失敗,這個函數(shù)就會返回一個SOCKET_ERROR,錯誤信息可以通過WSAGetLastError函數(shù)返回。closesocket(mysocket); /函數(shù)用來結(jié)束一個已經(jīng)存在的套接字,當一個套接字不再使用時,需要調(diào)用這個函數(shù)來釋放套接字。printf(Port %d - closedn, i); else pcount+; printf(Port %d - openn, i); printf(n %d ports open on host - %sn, pcount, IP); printf(n);closesocket(mysocket); WSACleanup();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論