版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 利用socket實(shí)現(xiàn)雙機(jī)通信(計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì))
- 畢業(yè)設(shè)計(jì)--計(jì)算機(jī)網(wǎng)絡(luò)安全
- 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)畢業(yè)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)專業(yè)畢業(yè)設(shè)計(jì)(論文)
- 計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告-雙機(jī)互聯(lián)
- 計(jì)算機(jī)網(wǎng)絡(luò)習(xí)題+計(jì)算機(jī)網(wǎng)絡(luò)習(xí)題
- eklhbm有關(guān)計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)的論文計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文淺析計(jì)算機(jī)網(wǎng)絡(luò)安全
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文--- 計(jì)算機(jī)網(wǎng)絡(luò)管理軟件
- 計(jì)算機(jī)網(wǎng)絡(luò)安全畢業(yè)設(shè)計(jì)論文
- 計(jì)算機(jī)網(wǎng)絡(luò)企業(yè)網(wǎng)絡(luò)規(guī)劃畢業(yè)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)專業(yè)畢業(yè)設(shè)計(jì)--網(wǎng)絡(luò)設(shè)計(jì)與規(guī)劃
- 計(jì)算機(jī)網(wǎng)絡(luò)
- 畢業(yè)論文---計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)設(shè)計(jì)論文(企業(yè)網(wǎng)絡(luò)規(guī)劃)
- 畢業(yè)設(shè)計(jì)---《計(jì)算機(jī)網(wǎng)絡(luò)》課程開發(fā)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信試題
- 計(jì)算機(jī)網(wǎng)絡(luò)安全畢業(yè)論文---淺談?dòng)?jì)算機(jī)網(wǎng)絡(luò)安全
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文---淺談?dòng)?jì)算機(jī)網(wǎng)絡(luò)安全及建設(shè)
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論