版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、海南大學信息學院信息安全系專業(yè)課程安全掃描課程設計報告姓 名: 學 號: 學 院: 信息科學技術學院 成 績: 任課教師: 顧 劍 二一三年十二月五日目 錄摘 要 -11.引言 -11.1開發(fā)背景 -11.2 設計題目及要求-12.程序的編譯與開發(fā) -22.1 開發(fā)目的 -22.2 開發(fā)環(huán)境及工具-22.3 開發(fā)過程-23.基本思路及所涉及的相關理論 -23.1基本思路-23.2相關理論-2 3.2.1協(xié)議介紹 -2 3.2.2 TCP實現(xiàn)流程-33.2.3 UDP實現(xiàn)流程-53.2.4 Windows Socket 套接字編程原理-64.實驗過程-105、個人感想與感悟 - 23附錄(程序代
2、碼部分)-23附錄一:(基于TCP通信的客戶端與服務器)-23附錄二:(基于UDP通信的客戶端與服務器)-29附錄三:(基于 TCP/UDP 的網(wǎng)絡安全掃描) -38摘 要計算機信息網(wǎng)絡的發(fā)展加速了信息化時代的進程,但是隨著社會網(wǎng)絡化程度的增加,對計算機網(wǎng)絡的依賴也越來越大,網(wǎng)絡安全問題也日益明顯。端口掃描技術室發(fā)現(xiàn)安全問題的重要手段之一。當前進行網(wǎng)絡端口掃描的主要技術有:基于ARP、ICMP、TCP(包括TCP connect掃描、TCP SYN掃描、TCP ACK 掃描、TCP FIN掃描等)、UDP 網(wǎng)絡協(xié)議的網(wǎng)絡活動端口掃描。(1)、利用ARP協(xié)議獲取活動主機的MAC地址,當獲取的不為
3、“00-00-00-00-00-00”時,則認為當前主機可達,是活動的主機;(2)、利用ICMP協(xié)議,使用系統(tǒng)自帶的PING程序,當能PING 通目標主機時,認為是活動主機(能掃描到活動的端口);(3)、基于TCP的鏈接狀態(tài)當判斷鏈接成功認為主機可到達(并能掃描到相應的端口);(4)、基于UDP 的不可靠傳輸,我們可以通過套接字編程給目標主機發(fā)送消息,能夠得到返回消息,則認為主機可到達(相應掃描到端口)。根據(jù)以上方法,我們均能掃描到開放的端口,因此,我們同樣可以做到對自己電腦的自糾自查,對自己的主機實施相應的網(wǎng)絡安全保護。關鍵字:TCP連接 套接字 TCP/UDP端口掃描.客戶端、服務器及網(wǎng)絡
4、安全掃描的實現(xiàn)1.引言1.1開發(fā)背景 端口掃描,顧名思義,就是對目標主機的端口依次進行連接,對于能進行數(shù)據(jù)通信的,則認為是”開”狀態(tài),否則認為是”關”狀態(tài)。由于絕大部分公用服務于端口有對應關系,因此通過端口的”開”與”關”狀態(tài),可以初步判斷對方是否提供相應的服務,為下一步的操作提供參考。 端口是一個傳輸層的概念,因此端口掃描也僅限于在傳輸層上進行,傳輸層一般將協(xié)議分為TCP協(xié)議和UDP協(xié)議,所以端口掃描也根據(jù)掃描所采用的類型分為TCP端口掃描、UDP端口掃描兩大類。 端口掃描與其說是一種攻擊方法,不如說是一種檢測方法,因為通過端口掃描,即使是知道對方哪些端口是開的,也不意味著對方就一定提供了這
5、些端口對應的服務,更談不上能查出什么漏洞。但黑客正是用端口掃描預測一臺主機上都提供了哪些服務,如果所提供的這些服務存在漏洞,黑客就會利用這些漏洞對系統(tǒng)進行攻擊。而事實上即使沒有什么漏洞可找,僅就掃描所得的信息,就已經(jīng)給黑客提供大量的重要信息,因此端口掃描往往作為黑客攻擊的第一步。所以,對于任何一個擁有電腦的用戶完全有必要對端口進行詳細地了解,對于沒有實質(zhì)性作用的端口要關閉,對于必須開放的端口則盡可能地安裝其漏洞補丁程序。1.2 設計題目及要求(1)、至少建立TCP/UDP兩臺服務器服務器端口和服務必須有公開和保密(后門)兩類。(2)、完成TCP/UDP協(xié)議客戶端掃描程序可以掃描出公開和保密的全
6、部端口號,確定全部公開的服務,甚少可以確定一種保密的服務。(3)、可以掃描顧劍老師上課的服務器94,檢查其安全情況。(4)、可以掃描 服務器,檢查其安全情況。(5)、同學之間可以互相掃描各自的服務器,檢查其服務情況。(6)、不可掃描其他境內(nèi)服務器。(7)、寫出完整的試驗報告,并嘗試給出一些防范和修改建議。2.程序的編譯與開發(fā)2.1 開發(fā)目的1.了解和掌握TCP/IP協(xié)議的基本原理(TCP通信、UDP通信);2.了解網(wǎng)絡環(huán)境下的程序設計步驟和過程;3.掌握Winsock提供函數(shù)的功能和用法。2.2 開發(fā)環(huán)境及工具測試平臺:Windows XP Professional使用軟
7、件:Microsoft Visual C+ 6.0開發(fā)語言:C語言2.3 開發(fā)過程根據(jù)題目的要求,結合相應的算法理論及相關的基礎知識,在Microsoft Visual C+ 6.0的平臺下進行開發(fā)。具體過程參見下述的算法理論部分和程序流程步驟的分析。3.基本思路及所涉及的相關理論3.1基本思路 根據(jù)題目要求,逐步解析題目含義。實際上,該題目包含三個主要程序:基于TCP客戶端和服務器間的通信;基于UDP客戶端與服務器的通信;基于TCP和UDP的網(wǎng)絡活動端口掃描。由所學知識可知:TCP屬于面向連接型協(xié)議(可靠傳輸,通過三次握手連接完成),UDP屬于不可靠傳輸。在Windows平臺上,需要通過Wi
8、nsock套接字編程來實現(xiàn)。3.2相關理論3.2.1協(xié)議介紹(1)TCP TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個工業(yè)標準的協(xié)議集,它是為廣域網(wǎng)(WAN)設計的。它是由ARPANET網(wǎng)的研究機構發(fā)展起來的。 有時我們將TCP/IP描述為互聯(lián)網(wǎng)協(xié)議集"InternetProtocolSuite",TCP和IP是其中的兩個協(xié)議(后面將會介紹)。由于TCP和IP是大家熟悉的協(xié)議,以至于用TCP/IP或IP/TCP這個詞代替了整個協(xié)議集。這盡管有點奇怪,但沒有必要去爭論這個習慣。
9、例如,有時我們討論NFS是基于TCP/IP時,盡管它根本沒用到TCP(只用到IP和另一種交互式協(xié)議UDP,而不是TCP)。 TCP/IP的標準在一系列稱為RFC的文檔中公布。文檔由技術專家、特別工作組、或RFC編輯修訂。公布一個文檔時,該文檔被賦予一個RFC編號,如RFC959(FTP的說明文檔)、RFC793(TCP的說明文檔)、RFC791(IP的說明文檔)等。最初的RFC一直保留而從來不會被更新,如果修改了該文檔,則該文檔又以一個新號碼公布。因此,重要的是要確認你擁有了關于某個專題的最新RFC文檔。通常在RFC的開頭部分,有相關RFC的更新(update)、修改(errata)、作廢(o
10、bsolete)信息,提示讀者信息的時效性。詳情請閱讀網(wǎng)站RFC-editor1。(2)UCPUDP協(xié)議的全稱是用戶數(shù)據(jù)包協(xié)議,在網(wǎng)絡中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當報文發(fā)送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡應用。包括網(wǎng)絡視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務器模式的網(wǎng)絡應用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天UDP
11、仍然不失為一項非常實用和可行的網(wǎng)絡傳輸層協(xié)議。 與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP(網(wǎng)際協(xié)議)協(xié)議的頂層。根據(jù)OSI(開放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。UDP協(xié)議的主要作用是將網(wǎng)絡數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個典型的數(shù)據(jù)包就是一個二進制數(shù)據(jù)的傳輸單位。每一個數(shù)據(jù)包的前8個字節(jié)用來包含報頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。3.2.2 TCP實現(xiàn)流程:圖 3.2.1-1面向連接(TCP)的socket工作流程圖3.2.1-2 TCP正常連接過程圖3.2.1-3 TCP正常終止連接過程 圖 3.2.1-4 TCP 連接過程3.2.3 UDP
12、實現(xiàn)流程:圖 3.2.2-1 UDP工作過程圖 3.2.2-2 UDP掃描過程3.2.4 Windows Socket 套接字編程原理一、客戶機/服務器模式在TCP/IP網(wǎng)絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Client/Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的。客戶機/服務器模式在操作過程中采取的是主動請示方式:首先服務器方要先啟動,并根據(jù)請示提供相應服務:(過程如下)1、打開一個通信通道并告知本地主機,它愿意在某一個公認地址上接收客戶請求。2、等待客戶請求到達該端口。3、接收到重復服務請求,處理該請求并發(fā)送應答信號。4、
13、返回第二步,等待另一客戶請求5、關閉服務器??蛻舴剑?、打開一個通信通道,并連接到服務器所在主機的特定端口。2、向服務器發(fā)送服務請求報文,等待并接收應答;繼續(xù)提出請求3、請求結束后關閉通信通道并終止 二、套接字1. 套接字地址結構(1)、sockaddr結構:struct sockaddru_short sa_family; /* address family */char sa_data14; /* up to 14 bytes of direct address */; sa_family為網(wǎng)絡地址類型,一般為AF_INET,表示該socket在Internet域中進行通信,該地
14、址結構隨選擇的協(xié)議的不同而變化,因此一般情況下另一個與該地址結構大小相同的sockaddr_in結構更為常用,sockaddr_in結構用來標識TCP/IP協(xié)議下的地址。換句話說,這個結構是通用socket地址結構,而下面的sockaddr_in是專門針對Internet域的socket地址結構。(2)、sockaddr_in結構struct sockaddr_in short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero8;sin _family為網(wǎng)絡地址類型,必須設定為AF_INET。sin_port為服
15、務端口,注意不要使用已固定的服務端口,如HTTP的端口80等。如果端口設置為0,則系統(tǒng)會自動分配一個唯一端口。sin_addr為一個unsigned long的IP地址。sin_zero為填充字段,純粹用來保證結構的大小。2套接字的使用步驟(1)、啟動Winsock:對Winsock DLL進行初始化,協(xié)商Winsock的版本支持并分配必要的資源。(服務器端和客戶端)。(2)、創(chuàng)建套接字:(服務器端和客戶端)SOCKET socket( int af, int type, int protocol );、af為網(wǎng)絡地址類型,一般為AF_INET,表示在Internet域中使用。、type為套接
16、字類型,前面已經(jīng)介紹了。、protocol為指定網(wǎng)絡協(xié)議,一般為IPPROTO_IP。(3)、套接字的綁定:將本地地址綁定到所創(chuàng)建的套接字上。(服務器端和客戶端)int bind( SOCKET s, const struct sockaddr FAR * name, int namelen )、s為已經(jīng)創(chuàng)建的套接字。、name為socket地址結構,為sockaddr結構,如前面討論的,我們一般使用sockaddr_in結構,在使用再強制轉換為sockaddr結構。、namelen為地址結構的長度。(4)、套接字的監(jiān)聽:(服務器端)int listen(SOCKET s, int backl
17、og )、s為一個已綁定但未聯(lián)接的套接字。、backlog為指定正在等待聯(lián)接的最大隊列長度,這個參數(shù)非常重要,因為服務器一般可以提供多個連接。(5)、套接字等待連接:(服務器端)SOCKET accept( SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen )、s為處于監(jiān)聽模式的套接字。、sockaddr為接收成功后返回客戶端的網(wǎng)絡地址。、addrlen為網(wǎng)絡地址的長度。(6)、套接字的連接:將兩個套接字連結起來準備通信。(客戶端)int connect(SOCKET s, const struct sockaddr FAR * n
18、ame, int namelen )、s為欲連結的已創(chuàng)建的套接字。、name為欲連結的socket地址。、namelen為socket地址的結構的長度。(7)、套接字發(fā)送數(shù)據(jù):(服務器端和客戶端)int send(SOCKET s, const char FAR * buf, int len, int flags )、s為服務器端監(jiān)聽的套接字。、buf為欲發(fā)送數(shù)據(jù)緩沖區(qū)的指針。、len為發(fā)送數(shù)據(jù)緩沖區(qū)的長度。、flags為數(shù)據(jù)發(fā)送標記。、返回值為發(fā)送數(shù)據(jù)的字符數(shù)。(8)、套接字的數(shù)據(jù)接收:(客戶端)int recv( SOCKET s, char FAR * buf, int len, int
19、 flags )、s為準備接收數(shù)據(jù)的套接字。、buf為準備接收數(shù)據(jù)的緩沖區(qū)。、len為準備接收數(shù)據(jù)緩沖區(qū)的大小。、flags為數(shù)據(jù)接收標記。、返回值為接收的數(shù)據(jù)的字符數(shù)。(9)、中斷套接字連接:通知服務器端或客戶端停止接收和發(fā)送數(shù)據(jù)。(服務器端和客戶端)int shutdown(SOCKET s, int how)、s為欲中斷連接的套接字。、How為描述禁止哪些操作,取值為:SD_RECEIVE、SD_SEND、SD_BOTH。(10)、關閉套接字:釋放所占有的資源。(服務器端和客戶端)int closesocket( SOCKET s )、s為欲關閉的套接字 三、典型過程圖1. 面
20、向連接的套接字的系統(tǒng)調(diào)用時序圖圖 3.2.3-12.無連接協(xié)議的套接字調(diào)用時序圖圖 3.2.3-24、實驗過程(1)、至少建立TCP/UDP兩臺服務器服務器端口和服務必須有公開和保密(后門)兩類。一、TCP服務器、公開服務:在與客戶端進行連接時,能夠接收客戶端發(fā)送過來的消息。并返回相同的消息以響應客戶端,同時日志文件將會記錄這一切:(如圖4-1所示)圖 4-1 公開服務接收信息、保密服務:當客戶端發(fā)送停機密碼時,服務器會自動關機,不對任何客戶端提供服務:(圖4-2、圖4-3)圖 4-2(收到停機密碼的服務器)圖 4-3(發(fā)送了停機密碼的客戶端)二、UCP服務器、公開服務:能夠接收客戶端發(fā)送過來
21、的消息,并響應客戶端,同時日志文件將會記錄這一切:(如圖4-4所示)圖4-4公開服務接收信息圖 4-5 UDP客戶端界面4-6 發(fā)送了消息的UDP客戶端界面圖 4-7 服務器開啟了日志功能、保密服務:在客戶端發(fā)送了停機密碼后,可以控制服務器關機,但同時也會被服務器記錄在案。以便今后管理員對攻擊事件的追蹤。圖 4-8 服務器開啟日志功能(2)、完成TCP/UDP協(xié)議客戶端掃描程序可以掃描出公開和保密的全部端口號,確定全部公開的服務,甚少可以確定一種保密的服務。、掃描本機 1:查看哪些端口是開放的。圖 4-9查看本機端口的開放情況2:采用傳統(tǒng)單線程掃描熟知端口。圖 4-10 傳統(tǒng)順序掃描的結果截圖
22、3:日志功能圖 4-11 日志記錄5:采用多線程掃描熟知端口圖 4-12 多線程掃描的結果截圖6:日志功能圖 4-13 日志功能由以上截圖對比可知,單線程掃描的速度慢,而多線程掃描則實現(xiàn)了高并發(fā),掃描速度得到了大幅度的提升。但多線程掃描的難題是如何實現(xiàn)高并發(fā)卻不會出現(xiàn)錯誤。因此,本人在掃描器中設定了兩種模式,當掃描的端口范圍較小時,建議使用單線程模式,這樣可以避免多線程掃描端口范圍較小時產(chǎn)生的錯誤,雖然單線程是順序掃描而且一般服務器都有日志功能,但是掃描的范圍較小時,比掃描端口范圍大的更不容易被服務器察覺。當掃描端口范圍較大時,建議采用多線程模式,首先是因為它的掃描速度比單線程模式快得多,每多
23、創(chuàng)建一個線程掃描速度單線程快一倍,但線程并不是越多就越好,在這里我只創(chuàng)建了50個線程,掃描速度大約是原來單線程的50倍。其次,它所掃描的端口具有一定的隨機性,如果采用傳統(tǒng)的單線程模式順序掃描并且掃描的端口范圍大時,不僅掃描時間長,而且是順序掃描,這樣做是不明智的!(3)、可以掃描顧劍老師上課的服務器94,檢查其安全情況。第一步:查看主機是否存活。Ping 94圖 4-9 查看主機是否存活第二步:掃描主機的熟知端口號(01024)。圖 4-10掃描主機的熟知端口號(01024)圖 4-11 日志功能第三步:掃描主機的登記端口號(102549151)。圖
24、 4-12掃描主機的登記端口號(102549151)圖 4-13 日志功能記錄綜上,服務器94提供了ftp服務和telnet服務。首先,telnet服務器容易遭受到拒絕服務攻擊,另外telnet服務的開放使得為不合法用戶開啟了遠程登錄,并控制服務器,最后留下入侵后門。(4)、可以掃描 服務器,檢查其安全情況。第一步:登陸網(wǎng)站,查看網(wǎng)址是否有效。圖 4-14登陸網(wǎng)站,查看網(wǎng)址是否有效第二步:ping 域名以獲得IP地址。圖4-15 ping 域名以獲得IP地址第三步:掃描服務器的熟知端口(01024)圖 4-16掃描服務器的熟知端口(01024)給出一些防范和修改建議:li
25、nux的111端口可能存在安全隱患。建議關閉此端口。111端口是SUN公司的RPC(Remote Procedure Call,遠程過程調(diào)用)服務所開放的端口,主要用于分布式系統(tǒng)中不同計算機的內(nèi)部進程通信,RPC在多種網(wǎng)絡服務中都是很重要的組件。常見的RPC服務有rpcmountd、NFS、rpcstatd、rpccsmd、rpcttybd、amd等等。在Microsoft的Windows中,同樣也有RPC服務。如果可以不使用RPC服務的話,建議關閉此端口。第四步:查看該掃描記錄是否已存于日志文件中圖 4-17 日志功能第五步:掃描服務器的登記端口號(102549151)圖 4-18掃描服務器
26、的登記端口號(102549151)第六步:查看日志圖 4-19 查看日志分析:45457端口開放,可能是某黑客留下的一個后門,建議系統(tǒng)管理員盡快關閉此端口。否則將會被某些黑客利用。5、個人感想與感悟通過本次課程設計使我更為深刻地認識到了編程的重要性,雖然老師讓我們寫的代碼很多,但其實許多程序都是在老師的程序基礎上修改的,所以我們真正寫的代碼其實只有掃描器的部分。但盡管如此,仍是把我更難住了,本來希望的設計目標是、所有程序都跨平臺。、所有服務器都可以為多個客戶端進行服務。、掃描程序實現(xiàn)多線程隨機掃描。、所有程序都必須有日志記錄。、將TCP掃描器設計為TCP connect 掃描和TCP SYN掃
27、描兩種模式。但最終只實現(xiàn)了兩個半:掃描程序實現(xiàn)多線程隨機掃描、所有程序都必須有日志記錄、TCP掃描器設計為TCP connect 掃描。盡管沒有達到自己預定目標,但通過本次課程設計仍是讓我收獲很大,并且更加深刻地認識到了自己的不足。今后,本人一定要在編程方面加強。否則,真的就是心有余而力不足啊。實驗收獲:TCP/IP協(xié)議是網(wǎng)絡中使用最廣泛的協(xié)議。Socket 套接口,最早出現(xiàn)在Berkeley Unix中,最初只支持TCPIP協(xié)議族和Unix協(xié)議,現(xiàn)在它已支持很多協(xié)議,是最重要的網(wǎng)絡編程接口,特別是在Unix中,其核心直接支持socket 編程,幾乎所有的網(wǎng)絡應用程序都是用Socket API
28、來實現(xiàn)的。WIN平臺中,需要特別的處理并用動態(tài)庫socket動態(tài)庫DLL來實現(xiàn)。因此,需要在socket程序之外特別處理。面向連接的TCP通信:1,發(fā)起連接的為客戶端Client ,接收連接的一方稱為服務器端 Server。2,雙方的通信一般分三步:建立連接、數(shù)據(jù)傳送、釋放連接。3,在傳送過程中數(shù)據(jù)按順序傳送,很像電路交換,因此又稱為“虛電路(VC,Virtual Circuit)服務”。4,這是一種使用者感覺可靠的服務,但建立連接和釋放連接的開銷很大。面向非連接的UDP通信:1,互為客戶端和服務器端。任何一方都可隨時向對方發(fā)送或接收數(shù)據(jù)。2,這是一種使用者感覺不可靠的服務,主要體現(xiàn):報文丟失
29、、重復或與發(fā)送順序不一致等現(xiàn)象。3,使用者一定要編寫高層協(xié)議來自行解決這些問題。4,缺點:對使用者要求高,優(yōu)點:靈活、方便、效率很高(特別是對通信網(wǎng)絡,要求低,效率高)兩者比較:1,理論研究者為處理“不可靠”而做的選擇,面向連接:可靠性由低層服務(網(wǎng)絡)負責,面向非連接:可靠性由用戶負責。2,能否實際通信,取決于實際的底層服務(網(wǎng)絡)。面向非連接的數(shù)據(jù)報達到不了對方,面向連接的通信一樣也不可能(這時基本是連接都建立不起來)。3,能否通信的“信息”:可靠性兩者報告的方式不同。面向非連接需要使用者自己“感覺”,面向連接底層服務告訴使用者。得到“信息”的時間兩者并不一定(取決于使用者 )。4,底層(
30、網(wǎng)絡)為了保證“可靠”需要隨時進行通信(包含互發(fā)和記錄信息),這樣,開銷十分龐大。特別是在使用長時間不進行實際通信時,更是極大的浪費。理論上的結論:1,使用者水平高、聰明時,使用面向非連接方式是明智的。2,為了效率,使用面向非連接方式是明智的。3,在可以容忍數(shù)據(jù)丟失的情況下,使用面向非連接方式是明智的。如ping。如視頻/語音傳送。4,如果非想隨時了解線路是否可用,使用面向連接方式是明智的。附錄(程序代碼部分):附錄一:(基于TCP通信的客戶端與服務器)1. wqm_TCP_S.C 代碼#include<Winsock2.h>#include<stdio.h>#incl
31、ude<time.h>#include <sys/timeb.h>#include <io.h>#define socklen_t int #pragma comment (lib, "Ws2_32.lib")#define MyLogName "Tcp_S.log"#pragma pack(1) /結構在存儲時按字節(jié)對齊#define ECom -100 /* 系統(tǒng)錯誤 */#define EPara1 -101 /* 第1個參數(shù)錯誤 */#define EPara2 -102 /* 第2個參數(shù)錯誤 */#defin
32、e EMyRet -103 /* 自行退出錯誤 */#define MaxCliNo 5/* 打印系統(tǒng)錯誤號和錯誤信息后返回 */#define SysErr(S) perror(S);return(ECom);#define FFSTD fflush(stdout); /* 清除輸出緩沖器. */* 打印地址信息 */#define PrAdrr(Addr) printf("%sn",#Addr); printf("family:%u n",Addr.sin_family); printf("addr :%08x=%sn",Addr
33、.sin_addr.s_addr, inet_ntoa(Addr.sin_addr); printf("port :%u,%u n",Addr.sin_port, htons(Addr.sin_port);#define SERV_PORT 26 /* 服務器服務端口 */#define SA struct sockaddr /* socket地址縮寫 */#define MAXLEN 4096 /* 最大緩沖長度 */char ServerIP20=""FILE *fp;unsigned short SPort=SERV_PORT;u
34、nsigned short CPort;/*01*/int DoTCPServerDisp(void); /* 沒有記錄 的服務程序 */#define Demainint main(int argc,char *argv)int Ret=1;printf("/*TCP服務器*/n");printf(" Server IP=%s Port=%dn",ServerIP,SPort);if(fp=fopen("Tcp_S.log","a")=NULL)printf("不能打開文件!n");exit(
35、1);elseprintf("TCP服務器日志已打開!n"); DoTCPServerDisp(); /* 記錄接收發(fā)送數(shù)據(jù)的服務程序 */*01*/int DoTCPServerDisp() #ifdef _WIN32 WSADATA wsaData; #endif static SerNo=0; /*服務次數(shù) */ int SockFd,sAccept; /* socket 句柄 */ int SockLen; /* socket 結構長度 */ int iSend; /* 發(fā)送信息長度 */ int iRecv; /* 接收信息長度 */ #define BufLen
36、 1024 char SBufBufLen; /* 發(fā)送緩沖區(qū) */ char RBufBufLen; /* 接收緩沖區(qū) */ int SendLen; /* 發(fā)送數(shù)據(jù)長度 */ struct sockaddr_in ser,cli;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) SysErr("WSAStartup() Failed!"); if(SockFd=socket(AF_INET,SOCK_STREAM,0)=INVALID_SOCKET)SysErr("socket() Failed!"); se
37、r.sin_family=AF_INET; ser.sin_port=htons(SPort); ser.sin_addr.s_addr=inet_addr(ServerIP); printf("TCP Server Running at(Ip=%s Port=%d)n",ServerIP,SPort); if(bind(SockFd,(struct sockaddr*)&ser,sizeof(ser)=SOCKET_ERROR) SysErr("bind() Failed!"); SockLen=sizeof(ser); if(listen(S
38、ockFd,MaxCliNo)<-1) SysErr("listen() Failed!"); SockLen=sizeof(cli);LoopAccept: /* 接受客戶端連接請求 */ sAccept=accept(SockFd,(struct sockaddr*)&cli,&SockLen); if(sAccept=(-1)SysErr("accept() Failed!"); printf("Accepted client IP:%s,prot:%dn", inet_ntoa(ser.sin_addr)
39、, ntohs(ser.sin_port);fprintf(fp,"Accepted client IP:%s,prot:%dn", inet_ntoa(ser.sin_addr), ntohs(ser.sin_port);Loop: iRecv=recv(sAccept,RBuf,sizeof(RBuf),0); if(iRecv<0) SysErr("receive error from client!n"); else if(iRecv=0) printf(" 一個客戶端結束,現(xiàn)在開始為下一個客戶服務!n");/可以順序地
40、為多個用戶服務,但前提是前一個用戶必須退出 goto LoopAccept; /* 服務處理 */ RBufiRecv=0; sprintf(SBuf,"%s(%d:%d)SerNo=%d R(%s:%d)", RBuf,strlen(RBuf),iRecv,+SerNo, inet_ntoa(cli.sin_addr),ntohs(cli.sin_port); fprintf(fp,"%s(%d:%d)SerNo=%d R(%s:%d)", RBuf,strlen(RBuf),iRecv,+SerNo, inet_ntoa(cli.sin_addr),
41、ntohs(cli.sin_port); iSend=send(sAccept,SBuf,strlen(SBuf),0); if(iSend<-1)SysErr("send() Failed:%dn"); else if(iSend=0) printf("iSend=0 Errorr? n");goto Loop; fprintf(fp,"send %s(%d) OKn",SBuf,iSend); goto Loop; LEnd: closesocket(SockFd); WSACleanup(); return(0);/* e
42、nd 01 int DoTCPServer() */2. wqm_TCP_C.C 代碼#include<Winsock2.h>#include<stdio.h>#include<time.h>#include <sys/timeb.h>#include <io.h>#define socklen_t int /*Gujian's programs need the definition */#pragma comment (lib, "Ws2_32.lib")#pragma pack(1) /結構在存儲時按
43、字節(jié)對齊#define ECom -100 /* 系統(tǒng)錯誤 */#define EPara1 -101 /* 第1個參數(shù)錯誤 */#define EPara2 -102 /* 第2個參數(shù)錯誤 */#define EMyRet -103 /* 自行退出錯誤 */* 打印系統(tǒng)錯誤號和錯誤信息后返回 */#define SysErr(S) perror(S);return(ECom);#define FFSTD fflush(stdout); /* 清除輸出緩沖器. */* 打印地址信息 */#define PrAdrr(Addr) printf("%sn",#Addr); pr
44、intf("family:%u n",Addr.sin_family); printf("addr :%08x=%sn",Addr.sin_addr.s_addr, inet_ntoa(Addr.sin_addr); printf("port :%u,%u n",Addr.sin_port, htons(Addr.sin_port);#define SERV_PORT 26 /* 服務器服務端口 */#define SA struct sockaddr /* socket地址縮寫 */#define MAXLEN 4096 /* 最大
45、緩沖長度 */char ServerIP20=""unsigned short SPort=SERV_PORT;unsigned short CPort;/*c01*/int DoTCPClient(void); /* 沒有記錄程序的客戶端程序*/*c02*/int DoTCPCliWri(void); /* 有記錄程序的客戶端程序*/*02*/int DoTCPServerWrite(void); /* 記錄接收發(fā)送數(shù)據(jù)的服務程序 */#define Demainint main(int argc,char *argv)int Ret=1; #ifdef
46、 Demainprintf("/* TCP客戶端 */n");printf(" Server IP=%s Port=%dn",ServerIP,SPort);#endif DoTCPClient(); /* 沒有記錄程序的客戶端程序*/ DoTCPCliWri(); /* 有記錄程序的客戶端程序*/#define EndStr "RUN" /* 服務器停機密碼*/#define DeDoTCPClient/*c01*/int DoTCPClient() /* 沒有記錄程序的客戶端程序*/ #ifdef _WIN32 WSADATA w
47、saData; #endif int SNo=0; int SockFd; /* socket 句柄 */ int iSend; /* 發(fā)送信息長度 */ int iRecv; /* 接收信息長度 */ #define BufLen 1024 char SBufBufLen; /* 發(fā)送緩沖區(qū) */ char RBufBufLen; /* 接收緩沖區(qū) */ int SendLen; /* 發(fā)送數(shù)據(jù)長度 */ struct sockaddr_in ser; char C='O' memset(RBuf,0,sizeof(RBuf); #ifdef _WIN32 if(WSASta
48、rtup(MAKEWORD(2,2),&wsaData)!=0) printf("Failed to load Winsock!n"); return -1; #endif ser.sin_family=AF_INET; ser.sin_port=htons(SPort); ser.sin_addr.s_addr=inet_addr(ServerIP); if(SockFd=socket(AF_INET,SOCK_STREAM,0)=INVALID_SOCKET) SysErr("socket() Failed!"); if(connect(So
49、ckFd,(struct sockaddr*)&ser,sizeof(ser)=INVALID_SOCKET) SysErr("connect() Failed");Loop: printf(" 請輸入你想說的話:"); scanf("%s",SBuf); SendLen=strlen(SBuf); sprintf(&SBufSendLen,"Client:%d",SNo+); #ifdef DeDoTCPClient printf("SBuf=%s:%d EndStr=%s:%dn", SBuf,SendLen,EndStr,strlen(EndStr); #endif if(memcmp(SBuf,EndStr,SendLen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全腦招商加盟合同范例
- 合作合同范例簡體
- 汽修輔料采購合同范例
- 2024年汽車融資租賃回租合同范本(含車輛租賃合同解除條件)3篇
- 美發(fā)避險合同范例
- 建房施工安全合同范例
- 機械建設合同范例
- 企業(yè)控股合并合同范例
- 暑假租房轉租合同范例
- 2024年消防安全監(jiān)測與預警系統(tǒng)合同
- GB/T 13247-1991鐵合金產(chǎn)品粒度的取樣和檢測方法
- 《網(wǎng)絡傳播概論》考試復習題庫(附答案)
- 熱力環(huán)流(公開課)課件
- 高壓電氣設備的工頻耐壓試驗電壓重點標準
- 蘇教版小學四年級上冊數(shù)學期末知識點綜合復習假期練習題單
- 《國家憲法日》班會教學課件
- TOC-DBR培訓課程完整版ppt課件
- 承插型盤扣式盤扣高支模施工方案(專家論證通過)
- 機械設計課程設計---榫槽成形半自動切削機
- 自動化立體庫貨架驗收報告
- 數(shù)學模型實驗報告5
評論
0/150
提交評論