2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  畢 業(yè) 設(shè) 計(jì)</b></p><p><b>  摘要</b></p><p>  Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無(wú)聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一

2、對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過程。使用無(wú)聯(lián)接方式時(shí)其系統(tǒng)開銷比無(wú)聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。</p><p><b>  關(guān)鍵字</b></p><p>  WinSock TCP VC++ 雙機(jī)通

3、信</p><p><b>  目 錄</b></p><p>  一、設(shè)計(jì)題目………………………………………………………3</p><p>  二、目的與要求 ……………………………………………………3</p><p>  三、開發(fā)環(huán)境介紹…………………………………………………3</p>&l

4、t;p>  四、WinSocket簡(jiǎn)介……………………………………………3</p><p>  五、TCP/IP簡(jiǎn)介……………………………………………………5</p><p>  六、總體設(shè)計(jì)……………………………………………………6</p><p>  七、詳細(xì)設(shè)計(jì)……………………………………………………7</p><p>  八、系

5、統(tǒng)實(shí)現(xiàn)……………………………………………………9</p><p>  九、實(shí)驗(yàn)結(jié)果分析………………………………………………11</p><p>  十、主要程序代碼………………………………………………12</p><p>  十一、參考文獻(xiàn)…………………………………………………12</p><p><b>  一、設(shè)計(jì)題目</

6、b></p><p>  利用Socket實(shí)現(xiàn)雙機(jī)通信</p><p><b>  二、目的與要求</b></p><p>  利用WinSock來(lái)實(shí)現(xiàn)雙機(jī)通信,理解TCP狀態(tài)機(jī)圖。要求使用WinSock編程,采用其中的TCP面向連接方式,實(shí)現(xiàn)文本數(shù)據(jù)的交換。</p><p><b>  三、開發(fā)環(huán)境介紹

7、</b></p><p>  Microsoft Visual C++,(簡(jiǎn)稱Visual C++、MSVC、VC++或VC)微軟公司的C++開發(fā)工具,具有集成開發(fā)環(huán)境,可提供編輯C語(yǔ)言,C++以及C++/CLI等編程語(yǔ)言。VC++集成了便利的除錯(cuò)工具,特別是集成了Windows API、三維動(dòng)畫DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual

8、 C++ 2010。</p><p>  Visual C++以擁有“語(yǔ)法高亮”,IntelliSense(自動(dòng)編譯功能)以及高級(jí)除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動(dòng)正在調(diào)試的程序。其編譯及建置系統(tǒng)以預(yù)編譯頭文件、最小重建功能及累加鏈接著稱。這些特征明顯縮短程序編輯、編譯及鏈接的時(shí)間花費(fèi),在大型軟件計(jì)劃上尤其顯著。</p>

9、<p>  四、WinSocket簡(jiǎn)介</p><p>  1、WinSocket簡(jiǎn)介</p><p>  Socket接口是網(wǎng)絡(luò)編程(通常是TCP/IP協(xié)議,也可以是其他協(xié)議)的API。最早的Socket接口是Berkeley接口,在Unxi操作系統(tǒng)中實(shí)現(xiàn)。WinSock也是一個(gè)基于Socket模型的API,在Microsoft Windows操作系統(tǒng)類中使用。它在Berk

10、eley接口函數(shù)的基礎(chǔ)之上,還增加了基于消息驅(qū)動(dòng)機(jī)制的Windows擴(kuò)展函數(shù)。Winscok1.1只支持TCP/IP網(wǎng)絡(luò),WinSock2.0增加了對(duì)更多協(xié)議的支持</p><p>  Windows Socket簡(jiǎn)稱Winsock,是在Windows環(huán)境下使用的一套網(wǎng)絡(luò)編程規(guī)范,基于4.3BSD的BSD Socket API制定。</p><p>  套接字?jǐn)?shù)據(jù)傳輸是一種特殊的I/O,套

11、接字也是一種文件描述符。Socket具有一個(gè)類似于打開文件的函數(shù)調(diào)用----socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的建立連接、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實(shí)現(xiàn)的。</p><p>  Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket??蛻舫绦蚩梢韵騍ocket寫請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過S

12、ocket將結(jié)果返回給用戶。</p><p>  Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無(wú)聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過程。使用無(wú)聯(lián)接方式時(shí)其系統(tǒng)開銷比無(wú)聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳

13、輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。</p><p>  2、WinSocket通信原理</p><p>  Socket實(shí)際上在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸/接收的信息都通過這個(gè)Socket接口來(lái)實(shí)現(xiàn)的。在應(yīng)用開發(fā)中

14、可以像使用文件句柄一樣來(lái)對(duì)Socket句柄進(jìn)行讀/寫操作。目前可以使用兩種套接口,即流式套接字(SOCK_STREAM)和數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)。流式套接字提供了一個(gè)面向連接的、可靠的、數(shù)據(jù)無(wú)錯(cuò)的、無(wú)重復(fù)發(fā)送的及按發(fā)送順序接收數(shù)據(jù)的服務(wù);數(shù)據(jù)報(bào)套接字提供不可靠的、無(wú)連接的數(shù)據(jù)報(bào)傳輸服務(wù)。</p><p>  套接字可分為阻塞套接字和非阻塞套接字。阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),直到成功才返回

15、,否則一直阻塞在此網(wǎng)絡(luò)調(diào)用上;而非阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),不管是否執(zhí)行成功,都立即返回。實(shí)際上非阻塞套接字是用得最多的。</p><p>  C/S模型,即客戶機(jī)/服務(wù)器模型,是一種非對(duì)稱式編程模式。對(duì)于這種模式而言,其中一部分需要作為服務(wù)端,用來(lái)響應(yīng)并為客戶提供固定的服務(wù);另一部分則作為客戶端用來(lái)向服務(wù)端提出請(qǐng)求或要求某種服務(wù)。在實(shí)際應(yīng)用中,程序可以同時(shí)包含客戶端和服務(wù)端。</p>

16、<p>  面向連接協(xié)議的通信過程如下:服務(wù)端和客戶端都必須建立通信套接字,而服務(wù)端套接字應(yīng)先進(jìn)入監(jiān)聽狀態(tài),然后客戶端套接字發(fā)出連接請(qǐng)求,服務(wù)端套接字收到連接請(qǐng)求后,建立一個(gè)新套接字與客戶端套接字進(jìn)行通信,原來(lái)負(fù)責(zé)監(jiān)聽的套接字仍進(jìn)行監(jiān)聽,如果再收到其它客戶端套接字的連接請(qǐng)求,則再建立一個(gè)新套接字與之通信。通信完畢后斷開連接,關(guān)閉相應(yīng)套接字。</p><p>  socket有三種主要類型:stream

17、 sockets, datagram sockets 和raw sockets 。 Stream socket提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)地發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒接受數(shù)據(jù)慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制。Datagram socket提供無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)送,不提供無(wú)差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收。Raw socket可以對(duì)較低層

18、次協(xié)議,如IP、ICMP直接訪問。</p><p>  五、TCP/IP簡(jiǎn)介</p><p>  1、TCP/IP簡(jiǎn)介</p><p>  TCP/IP(Transmission Control Protocol/Internet Protocol)的簡(jiǎn)寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Intern

19、et國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡(jiǎn)單地說(shuō),就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。</p><p>  TCP(Transmission Control Protocol)中文稱為“傳輸控制協(xié)議”。TCP是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層(Transport layer)通信協(xié)議。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,UDP是同一層內(nèi)另一個(gè)重要的傳輸協(xié)議。</p>

20、<p>  IP是英文Internet Protocol的縮寫,中文稱為“網(wǎng)際協(xié)議”,是為計(jì)算機(jī)網(wǎng)絡(luò)相互連接進(jìn)行通信而設(shè)計(jì)的協(xié)議。在因特網(wǎng)中,它是能使連接到網(wǎng)上的所有計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)相互通信的一套規(guī)則,規(guī)定了計(jì)算機(jī)在因特網(wǎng)上進(jìn)行通信時(shí)應(yīng)當(dāng)遵守的規(guī)則。任何廠家生產(chǎn)的計(jì)算機(jī)系統(tǒng),只要遵守 IP協(xié)議就可以與因特網(wǎng)互連互通。</p><p><b>  2、TCP的作用</b></

21、p><p>  在因特網(wǎng)協(xié)議族中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。提供可靠的、像管道一樣的連接。</p><p>  應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)摹⒂?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分割成適當(dāng)長(zhǎng)度的報(bào)文段(通常受該計(jì)算機(jī)連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)的限制)。之后TCP把結(jié)果包傳給IP層,由它來(lái)通過網(wǎng)絡(luò)將包傳送給接收端實(shí)體的TCP層。TCP為了保證不

22、發(fā)生丟包,就給每個(gè)字節(jié)一個(gè)序號(hào),同時(shí)序號(hào)也保證了傳送到接收端實(shí)體的包的按序接收。然后接收端實(shí)體對(duì)已成功收到的字節(jié)發(fā)回一個(gè)相應(yīng)的確認(rèn)(ACK);如果發(fā)送端實(shí)體在合理的往返時(shí)延(RTT)內(nèi)未收到確認(rèn),那么對(duì)應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會(huì)被重傳。TCP用一個(gè)校驗(yàn)和函數(shù)來(lái)檢驗(yàn)數(shù)據(jù)是否有錯(cuò)誤;在發(fā)送和接收時(shí)都要計(jì)算校驗(yàn)和。</p><p>  首先,TCP建立連接之后,通信雙方都同時(shí)可以進(jìn)行數(shù)據(jù)的傳輸,其次,TCP通信是全雙工

23、的;在保證可靠性上,采用超時(shí)重傳和捎帶確認(rèn)機(jī)制。</p><p>  在流量控制上,采用滑動(dòng)窗口協(xié)議,協(xié)議中規(guī)定,對(duì)于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳。</p><p>  在擁塞控制上,采用慢啟動(dòng)算法。</p><p>  TCP所提供服務(wù)的主要特點(diǎn)有:1、面向連接的傳輸;2、端到端的通信;3、高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;4、全雙工方式傳輸;5、

24、采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;6、緊急數(shù)據(jù)傳送功能。</p><p><b>  六、總體設(shè)計(jì)</b></p><p>  開發(fā)環(huán)境為VC++,使用WinSock實(shí)現(xiàn)Windows下網(wǎng)絡(luò)通信,使用C/S結(jié)構(gòu)。</p><p>  程序分為服務(wù)器程序和客戶端程序,服務(wù)器程序接受客戶端程序發(fā)起的連接并接受客戶端的發(fā)出的信息。</

25、p><p><b>  服務(wù)器建立的步驟:</b></p><p>  創(chuàng)建TCP協(xié)議的監(jiān)聽套接字。</p><p>  將創(chuàng)建的套接字綁定到設(shè)置好的參數(shù)名字上,使用bind函數(shù)來(lái)實(shí)現(xiàn),參數(shù)由程序運(yùn)行時(shí)傳入。</p><p>  將套接字設(shè)置為監(jiān)聽模式,使用listen函數(shù)實(shí)現(xiàn)。</p><p>  

26、若有客戶端試圖建立連接,服務(wù)端使用accept函數(shù)調(diào)用來(lái)接受連接。</p><p><b>  客戶端建立的步驟:</b></p><p>  創(chuàng)建TCP協(xié)議的監(jiān)聽套接字。</p><p>  將創(chuàng)建好的套接字綁定到設(shè)置好的參數(shù)上,使用bind函數(shù)來(lái)實(shí)現(xiàn),參數(shù)由程序運(yùn)行時(shí)傳入。</p><p>  是用套接字向服務(wù)器發(fā)起

27、連接。</p><p><b>  如下圖所示</b></p><p><b>  連接</b></p><p><b>  七、詳細(xì)設(shè)計(jì)</b></p><p><b>  客戶端程序流程圖:</b></p><p><b&

28、gt;  錯(cuò)誤</b></p><p><b>  正確</b></p><p><b>  循環(huán)發(fā)送信息</b></p><p><b>  服務(wù)端程序流程圖</b></p><p><b>  錯(cuò)誤</b></p><p

29、><b>  正確</b></p><p>  收到客戶端的連接請(qǐng)求</p><p><b>  八、系統(tǒng)實(shí)現(xiàn)</b></p><p>  程序中使用的主要變量</p><p>  #define MAX_SEND_NUM 4096 //發(fā)送的最大字節(jié)數(shù)</p><p>

30、;  unsigned int serverPort; //服務(wù)器端口地址</p><p>  unsigned int clientPort; //客戶端端口地址</p><p>  char serverIp[30]; //用于存儲(chǔ)服務(wù)器IP地址</p><p>  SOCKET clientSocket; //套接字結(jié)構(gòu)體</p><p&g

31、t;  char sendBuf[MAX_SEND_NUM]; //發(fā)送緩存</p><p>  int retn;//存儲(chǔ)返回值信息</p><p>  struct sockaddr_in serverInfo; //存放服務(wù)器信息</p><p>  struct sockaddr_in localInfo; //存放本機(jī)信息</p><p

32、>  struct hostent *host = NULL;</p><p>  unsigned int listen_port;//接收端口</p><p>  程序中使用的主要函數(shù)介紹</p><p>  1、使用Winsock API編制的網(wǎng)絡(luò)應(yīng)用程序中,在調(diào)用任何一個(gè)Winsock函數(shù)之前都必須檢查協(xié)議棧安裝情況,使用函數(shù)WSAStartup()完

33、成操作。</p><p>  WSAStartup(MAKEWORD(2,2), &wsadata)</p><p>  int WSAStartup(</p><p>  WORD wVersionRequested,</p><p>  LPWSADATA lpWSAData);</p><p>  wVe

34、rsionRequested是一個(gè)WORD型(雙字型)數(shù)值,指定使用的版本號(hào),對(duì)Winsock2.2而言,此參數(shù)的值為0x0202,也可以用宏MAKEWORD(2,2)來(lái)獲得</p><p>  lpWSAData是一個(gè)指向WSADATA結(jié)構(gòu)的指針,它返回關(guān)于Winsock實(shí)現(xiàn)的詳細(xì)信息</p><p>  2、應(yīng)用程序在使用套接字通信前,必須要擁有一個(gè)套接字,使用socket()函數(shù)來(lái)給

35、應(yīng)用程序創(chuàng)建一個(gè)套接字。</p><p>  socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)</p><p>  SOCKET socket(</p><p>  int af,//地址族</p><p>  int type,//類型</p><p>  int protocol/

36、/協(xié)議);</p><p>  3、當(dāng)socket()創(chuàng)建了一個(gè)套接字后,需要將該套接字與該主機(jī)上提供服務(wù)的IP地址和端口聯(lián)系在一起,bind()函數(shù)用于完成這樣的綁定。</p><p>  bind(clientSocket, (struct sockaddr *)&localInfo, sizeof(localInfo)</p><p><b>

37、;  int bind(</b></p><p><b>  SOCKET s,</b></p><p>  const struct sockaddr FAR * name,</p><p>  int namelen);</p><p>  4、在一個(gè)服務(wù)器端用socket()調(diào)用成功創(chuàng)建了一個(gè)套接字,并

38、用bind()函數(shù)和一個(gè)指定的地址關(guān)聯(lián)后,就需要指示該套接字進(jìn)入監(jiān)聽狀態(tài),這需要通過listen()函數(shù)來(lái)實(shí)現(xiàn)</p><p>  int listen(</p><p>  SOCKET s,// 一個(gè)已綁定了地址,但還未建立連接的套接字</p><p>  int backlog);// 指定正在等待連接的最大隊(duì)列長(zhǎng)度</p><p> 

39、 5、當(dāng)服務(wù)器端建立好套接字并與一個(gè)本地地址綁定后,就進(jìn)入監(jiān)聽狀態(tài),等待客戶發(fā)出連接請(qǐng)求。在客戶端套接字建立好之后,就調(diào)用connect()函數(shù)來(lái)與服務(wù)器建立連接。</p><p>  int connect(</p><p><b>  SOCKET s,</b></p><p>  const struct sockaddr FAR * n

40、ame,</p><p>  int namelen);</p><p>  6、在服務(wù)器端調(diào)用accept()函數(shù)可以接收來(lái)自客戶端由connect()發(fā)出的連接請(qǐng)求,雙方進(jìn)入連接狀態(tài)。</p><p>  SOCKET accept(</p><p><b>  SOCKET s,</b></p>&l

41、t;p>  struct sockaddr FAR * addr,</p><p>  int FAR * addrlen);</p><p>  7、使用send()函數(shù)在已經(jīng)建立連接的套接字上發(fā)送數(shù)據(jù)。</p><p><b>  int send(</b></p><p><b>  SOCKET

42、s,</b></p><p>  const char FAR * buf,</p><p><b>  int len,</b></p><p>  int flags);</p><p>  8、從套接字上接收數(shù)據(jù),使用recv()函數(shù)。</p><p><b>  in

43、t recv(</b></p><p><b>  SOCKET s,</b></p><p>  char FAR * buf,</p><p><b>  int len,</b></p><p>  int flags);</p><p>  當(dāng)連接結(jié)束的時(shí)

44、候,可以使用closesocket()函數(shù)和WSACleanup()函數(shù)進(jìn)行清理工作。</p><p>  用于格式轉(zhuǎn)換的函數(shù)有:</p><p>  htons(), htonl(),</p><p><b>  九、實(shí)驗(yàn)結(jié)果分析</b></p><p>  首先啟動(dòng)服務(wù)器程序,輸入監(jiān)聽端口等參數(shù),程序開始監(jiān)聽,運(yùn)行界

45、面如下:</p><p>  啟動(dòng)服務(wù)器程序,輸入監(jiān)聽端口等參數(shù),程序連接上服務(wù)器,輸入發(fā)送信息,運(yùn)行界面如下:</p><p>  此時(shí),服務(wù)端收到客戶端發(fā)送的數(shù)據(jù),顯示如下:</p><p>  自此,連接建立成功,兩個(gè)程序通信也成功。</p><p><b>  十、主要程序代碼</b></p>&l

46、t;p>  server.cpp</p><p>  int ClientFunc(SOCKET clientSocket){</p><p>  char recvBuff[MAX_RECV_NUM];</p><p><b>  int retn;</b></p><p>  struct sockaddr_i

47、n peerInfo;</p><p>  int len=sizeof(peerInfo);</p><p>  getpeername(clientSocket,(struct sockaddr*)&peerInfo,&len); // 獲得客戶端IP地址信息</p><p><b>  while(1)</b></p

48、><p><b>  {</b></p><p>  retn = recv(clientSocket, recvBuff, MAX_RECV_NUM, 0);</p><p>  if (retn == 0) // 沒有接收到任何數(shù)據(jù)</p><p><b>  {</b></p>&l

49、t;p><b>  break;</b></p><p><b>  }</b></p><p>  else if (retn == SOCKET_ERROR)</p><p><b>  {</b></p><p>  printf("接收數(shù)據(jù)失敗\n&qu

50、ot;);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  recvBuff[retn] = '\0';</p><p>  printf("接收到客戶端信息: %s\n", recvBuff); //

51、 輸出客戶端發(fā)送的消息</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int main(int argc, char **argv)</p><p&

52、gt;<b>  {</b></p><p>  WSADATA wsd;</p><p>  SOCKET listenSocket;</p><p>  SOCKET clientSocket;</p><p>  int addrSize;</p><p>  struct soc

53、kaddr_in localInfo;</p><p>  struct sockaddr_in clientInfo;</p><p>  CheckInput(argc, argv);</p><p>  if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)</p><p><b>  {&

54、lt;/b></p><p>  printf("加¨®載?Winsock失º¡ì敗㨹!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p>

55、<p>  // 創(chuàng)建監(jiān)聽的socket</p><p>  listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); </p><p>  if (listenSocket == SOCKET_ERROR)</p><p><b>  {</b></p>&l

56、t;p>  printf("創(chuàng)ä¡ä建¡§監(jiān)¨¤聽¬y的Ì?socket失º¡ì敗㨹\n");</p><p><b>  return 0;</b></p><p><b>  

57、}</b></p><p>  localInfo.sin_addr.s_addr = htonl(INADDR_ANY);</p><p>  localInfo.sin_family = AF_INET;</p><p>  localInfo.sin_port = htons(listen_port);</p><p>&l

58、t;b>  // 進(jìn)行地址綁定</b></p><p>  if (bind(listenSocket, (struct sockaddr *)&localInfo, sizeof(localInfo)) == SOCKET_ERROR)</p><p><b>  {</b></p><p>  printf(&qu

59、ot;綁定socket失敗\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  // 開始監(jiān)聽,最大同時(shí)連接數(shù)設(shè)置為</p><p>  listen(listenSocket, 64);</p>&l

60、t;p>  printf("服務(wù)器在端口%d開始監(jiān)聽\n",listen_port);</p><p>  // 接受客戶端的信息</p><p><b>  while (1)</b></p><p><b>  {</b></p><p>  addrSize = si

61、zeof(clientInfo);</p><p>  // 接受客戶的連接</p><p>  clientSocket = accept(listenSocket, (struct sockaddr *)&clientInfo, &addrSize);</p><p>  if (clientSocket == INVALID_SOCKET)&l

62、t;/p><p><b>  { </b></p><p>  printf("接受連接失敗\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  Clien

63、tFunc(clientSocket);</p><p><b>  }</b></p><p>  closesocket(listenSocket);</p><p>  WSACleanup();</p><p><b>  return 1;</b></p><p>

64、<b>  }</b></p><p>  Client.cpp</p><p>  int main(int argc, char *argv[])</p><p><b>  {</b></p><p>  if (WSAStartup(MAKEWORD(2,2), &wsadata)

65、!= 0){</p><p>  printf("加載Winsock失敗!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  clientSocket = socket(AF_INET, SOCK_STR

66、EAM, IPPROTO_TCP);</p><p>  if (clientSocket == INVALID_SOCKET) {</p><p>  printf("創(chuàng)建客戶端socket失敗: %d\n", WSAGetLastError());</p><p><b>  return 0;</b></p>

67、;<p><b>  }</b></p><p>  // 設(shè)置服務(wù)器參數(shù)</p><p>  serverInfo.sin_family = AF_INET;</p><p>  serverInfo.sin_port = htons(serverPort);</p><p>  serverInfo.s

68、in_addr.s_addr = inet_addr(serverIp);</p><p><b>  //設(shè)置本機(jī)參數(shù)</b></p><p>  localInfo.sin_addr.s_addr = htonl(INADDR_ANY);</p><p>  localInfo.sin_family = AF_INET;</p>

69、<p>  localInfo.sin_port = htons(clientPort);</p><p>  if (bind(clientSocket, (struct sockaddr *)&localInfo, sizeof(localInfo)) == SOCKET_ERROR){</p><p>  printf("綁定客戶端端口失敗\n&quo

70、t;);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  // 客戶端發(fā)起連接</p><p>  if (connect(clientSocket, (struct sockaddr *)&serverInfo, size

71、of(serverInfo)) == SOCKET_ERROR){</p><p>  printf("連接服務(wù)器失敗\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  printf("成功連接

72、上服務(wù)器 %s\n",serverIp);</p><p>  // 向服務(wù)器發(fā)送信息</p><p><b>  while(1){</b></p><p>  printf("請(qǐng)輸入要發(fā)送的信息:");</p><p>  gets(sendBuf);</p><p&

73、gt;  retn = send(clientSocket, sendBuf, strlen(sendBuf),0);</p><p>  if(retn == 0){</p><p><b>  break;</b></p><p><b>  }</b></p><p>  else if (r

74、etn == SOCKET_ERROR){</p><p>  printf("發(fā)送數(shù)據(jù)失敗\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p>&

75、lt;p>  closesocket(clientSocket);</p><p>  WSACleanup();</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  十一、參考文獻(xiàn)</b></

76、p><p>  計(jì)算機(jī)網(wǎng)絡(luò)(第五版) 謝希仁 清華大學(xué)出版社 2009</p><p>  Visual C++ 開發(fā)入門與編程實(shí)踐 屈磊 李媛媛 電子工業(yè)出版社 2007</p><p>  網(wǎng)絡(luò)安全技術(shù)實(shí)踐與代碼詳解 牛冠杰 筍大偉 等 機(jī)械工業(yè)出版社 2007</p><p>  WINDOWS網(wǎng)絡(luò)編程技術(shù) Anthony Jones 機(jī)械

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論