UDP服務(wù)器設(shè)計(jì)畢業(yè)論文_第1頁(yè)
UDP服務(wù)器設(shè)計(jì)畢業(yè)論文_第2頁(yè)
UDP服務(wù)器設(shè)計(jì)畢業(yè)論文_第3頁(yè)
UDP服務(wù)器設(shè)計(jì)畢業(yè)論文_第4頁(yè)
UDP服務(wù)器設(shè)計(jì)畢業(yè)論文_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、課程設(shè)計(jì)任務(wù)書(shū)學(xué)生姓名: 專(zhuān)業(yè)班級(jí): 指導(dǎo)教師: 工作單位: 題 目: 基于UDP的客戶(hù)/服務(wù)器通信程序設(shè)計(jì) 初始條件:操作系統(tǒng):XP開(kāi)發(fā)語(yǔ)言:C+要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書(shū)撰寫(xiě)等具體要求)1. 服務(wù)器端功能:接收并顯示客戶(hù)發(fā)送的信息,顯示該客戶(hù)IP地址和端口號(hào),并向該客戶(hù)發(fā)送“I am a server. ”的信息。2. 客戶(hù)端功能:向服務(wù)器發(fā)送“I am a client.”的信息,接收并顯示從服務(wù)器收到的信息。課程設(shè)計(jì)報(bào)告主要內(nèi)容要求: (1) 給出設(shè)計(jì)思路;(2) 詳細(xì)描述設(shè)計(jì)過(guò)程, 畫(huà)出程序流程圖; (3) 列出程序代碼,并寫(xiě)出程序注釋?zhuān)?4)

2、 給出測(cè)試結(jié)果。(5) 查閱至少5篇參考文獻(xiàn)。(6) 按武漢理工大學(xué)課程設(shè)計(jì)工作規(guī)范要求撰寫(xiě)設(shè)計(jì)報(bào)告書(shū),圖紙應(yīng)符合繪圖規(guī)范。時(shí)間安排: 6月 日 查閱資料, 6月 日- 日 方案設(shè)計(jì)、編程6月 日 撰寫(xiě)設(shè)計(jì)報(bào)告6月 日 答辯指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日1. 設(shè)計(jì)任務(wù)要求設(shè)計(jì)一個(gè)基于基于UDP的客戶(hù)/服務(wù)器通信程序設(shè)計(jì)1. 服務(wù)器端功能:接收并顯示客戶(hù)發(fā)送的信息,顯示該客戶(hù)IP地址和端口號(hào),并向該客戶(hù)發(fā)送“I am a server. ”的信息。2. 客戶(hù)端功能:向服務(wù)器發(fā)送“I am a client.”的信息,接收并顯示從服務(wù)器收到的信息。2.基于UDP協(xié)

3、議(面向無(wú)連接)的socket編程原理Socket適用于網(wǎng)絡(luò)環(huán)境中的進(jìn)程問(wèn)通信。它已成為當(dāng)前許多操作系統(tǒng)的網(wǎng)絡(luò)API,也是網(wǎng)絡(luò)操作系統(tǒng)中必不可少的基礎(chǔ)功能。隨著Linux操作系統(tǒng)和Internet的不斷發(fā)展Linux網(wǎng)絡(luò)環(huán)境下尤其是基于UDP的socket通信技術(shù)仍廣為注目。文章介紹了socket的編程原理并通過(guò)一個(gè)Java編寫(xiě)的客戶(hù)服務(wù)器程序描述了網(wǎng)絡(luò)中基于UDP的不同主機(jī)上的兩個(gè)進(jìn)程之間的socket通信機(jī)制。2.1 Socket通信機(jī)制Socket(套接字)機(jī)制是一種API,是網(wǎng)絡(luò)應(yīng)用程序的編程接口。Socket是通過(guò)標(biāo)準(zhǔn)文件描述符和其它程序通訊的一個(gè)方法。每一個(gè)套接字都用一個(gè)半相關(guān)描述

4、:協(xié)議本地地址、本地端El來(lái)表示;一個(gè)完整的套接字則用一個(gè)相關(guān)描述:協(xié)議,本地地址、本地端El、遠(yuǎn)程地址、遠(yuǎn)程端口,每一個(gè)套接字都有一個(gè)本地的由操作系統(tǒng)分配的唯一的套接字號(hào)。根據(jù)傳輸數(shù)據(jù)類(lèi)型的不同,Socket主要分為三類(lèi):1)流式Socket(SOCKSTREAM),在這種方式下,兩個(gè)通訊的應(yīng)用程序之聞要先建立一種虛擬的連接,提供可靠的、面向連接的通信流,它使用rcP協(xié)議。從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序的。2)數(shù)據(jù)報(bào)Socket(SOCKDGRAM),它使用數(shù)據(jù)報(bào)協(xié)議UDP,定義了一種無(wú)連接的服務(wù),數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無(wú)序的,并且不保證可靠、無(wú)差錯(cuò)。3)原始Socket,原始

5、套接字允許對(duì)底層協(xié)議如IP或ICMP直接訪問(wèn),它功能強(qiáng)大但使用較為不便,主要用于一些協(xié)議的開(kāi)發(fā)。22 UDP協(xié)議的工作原理UDP協(xié)議是一個(gè)面向無(wú)連接的協(xié)議。其連接的建立不必像TCP那樣需要服務(wù)器端偵聽(tīng),也不需要有客戶(hù)機(jī)請(qǐng)求連接,屬于一種“強(qiáng)制”性的網(wǎng)絡(luò)連接。UDP提供一對(duì)一或一對(duì)多的、無(wú)連接的數(shù)據(jù)報(bào)服務(wù)。該服務(wù)對(duì)消息中傳輸?shù)臄?shù)據(jù)提供不可靠的、最大努力的傳送,這意味著它不保證數(shù)據(jù)的到達(dá),也不保證所傳送的數(shù)據(jù)報(bào)的順序是否正確,UDP不重新傳輸丟失的數(shù)據(jù)。其主要工作是:將應(yīng)用程序傳輸過(guò)來(lái)的數(shù)據(jù)分塊交給網(wǎng)絡(luò)層,確認(rèn)接受到分組信息。盡管UDP無(wú)法像TCP一樣提供可靠的數(shù)據(jù)傳輸,但UDP并不比TCP缺乏優(yōu)

6、越性。UDP在傳輸效率方面比TCP要高一些,而且許多應(yīng)用程序并不需要保證嚴(yán)格的傳輸可靠性,比如視頻會(huì)議系統(tǒng)等,需要實(shí)時(shí)的交互,但并不要求音頻視頻的絕對(duì)正確。使用UDP協(xié)議傳輸數(shù)據(jù)時(shí),首先設(shè)置客戶(hù)計(jì)算機(jī)的local Port(本地端E1)屬性,而作為服務(wù)器的計(jì)算機(jī)只需要設(shè)置RemoterHost(遠(yuǎn)程主機(jī))屬性為客戶(hù)計(jì)算機(jī)的IP地址或域名即可,并將其Remote Port屬性設(shè)置為客戶(hù)計(jì)算機(jī)上的Local Port屬性。使用UDP端口號(hào)時(shí),端口提供了用于發(fā)送消息的位黃,每個(gè)端口由一個(gè)唯一的編號(hào)來(lái)標(biāo)識(shí)。當(dāng)應(yīng)用程序向另一臺(tái)計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),UDP生成一個(gè)數(shù)據(jù)頭。包括源端口,這些端口提供送達(dá)信息所需要

7、的地址。UDP協(xié)議還為數(shù)據(jù)和數(shù)據(jù)頭計(jì)算出求和檢驗(yàn)的值,在目標(biāo)計(jì)算機(jī)中,數(shù)據(jù)包被傳遞至UDP協(xié)議程序并送到目的地端口。2.2.1服務(wù)器端(接收端)程序設(shè)計(jì)步驟:1).加載套接字庫(kù)2).創(chuàng)建套接字(socket)3).將套接字綁定到一個(gè)本地地址和端口上(bind)4).等待接收數(shù)據(jù)(recvfrom)5).關(guān)閉套接字(closesocket)2.2.2客戶(hù)端(發(fā)送端)程序設(shè)計(jì)步驟:1).加載套接字庫(kù)2).創(chuàng)建套接字(socket)3).向服務(wù)器發(fā)送數(shù)據(jù)(sendto)4).關(guān)閉套接字(closesocket)Socket(),建立數(shù)據(jù)報(bào)式套接字,返回套接字號(hào)ssocket(),建立數(shù)據(jù)報(bào)式套接字,

8、返回套接字號(hào)s服務(wù)器方客戶(hù)方Bind(),將套接字s與本地的地址相連bind(),將套接字s 與本地地址相連相連Sendto()/recvfrom,通過(guò)套接字s交換數(shù)據(jù)recvfrom()/sendto(),通過(guò)套接字s 讀/寫(xiě)數(shù)據(jù),直到數(shù)據(jù)交換完。closesocket(),關(guān)閉套接字s,結(jié)束服務(wù)Closesocket(),關(guān)閉套接字,結(jié)束對(duì)話圖1-1 無(wú)連接協(xié)議的套接字調(diào)用時(shí)序圖2.3.程序流程圖2.3.1客戶(hù)端程序流程圖開(kāi)始加載套接字(winsock)庫(kù)創(chuàng)建socket()套接字,設(shè)置客戶(hù)端IP和端口號(hào)輸入信息gets(sendBuf);Sendto();發(fā)送數(shù)據(jù)到servrecvfro

9、m=SOCKET_ERROR printf(error:%d,errCode)break;退出循環(huán) YNrecvBuf0=qprintf(the chat end!);break;退出循環(huán) Y Nclosesocket(sockClient);WSACleanup();輸出接收到的信息結(jié)束圖2-1 客戶(hù)端程序流程圖2.3.2服務(wù)器程序流程圖開(kāi)始加載套接字(winsock)庫(kù)創(chuàng)建socket()設(shè)置服務(wù)器端的地址結(jié)構(gòu)和相關(guān)屬性將套接字和服務(wù)器地址結(jié)構(gòu)綁定,bind();從客戶(hù)端接受數(shù)據(jù)result=recvfrom();result=SOCKET_ERRORprintf(error:%d,err

10、Code)break;退出循環(huán) NYrecvBuf0=qprintf(the chat end!);break;退出循環(huán) NY輸出客戶(hù)端發(fā)來(lái)的信息Sprintf();printf();closesocket(sockClient);WSACleanup();結(jié)束gets(sendBuf);輸入信息sendto();將信息發(fā)送給客戶(hù)端圖2-2 服務(wù)器程序流程圖2.4.創(chuàng)建基于UDP協(xié)議的程序設(shè)計(jì)所涉及的相關(guān)函數(shù)說(shuō)明2.4.1.int WSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData):作用是加載套接字庫(kù)和進(jìn)行套接字庫(kù)的版本協(xié)商a.參數(shù)wVer

11、sionRequested:用于指定準(zhǔn)備加載的Winsock庫(kù)的版本,高位字節(jié)指定所需要的Winsock庫(kù)的副版本,低位字節(jié)則是主版本,可用MAKEWORD(X,Y)(其中,x為高位字節(jié),y為低位字節(jié))方便獲得wVersionRequested的正確值。b.參數(shù)lpWSAData:指向WSADATA結(jié)構(gòu)的指針,WSAStartup用其加載的庫(kù)版本有關(guān)的信息填在這個(gè)結(jié)構(gòu)中應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系統(tǒng)調(diào)用socket()向應(yīng)用程序提供創(chuàng)建套接字的手段2.4.2.SOCKET socket(int af,int type,int protocol):a.該調(diào)用要接收三個(gè)參數(shù):

12、af、type、protocol。參數(shù)af 指定通信發(fā)生的區(qū)域,UNIX 系統(tǒng)支持的地址族有:AF_UNIX、AF_INET、AF_NS 等,而DOS、WINDOWS 中僅支持AF_INET,它是網(wǎng)際網(wǎng)區(qū)域。因此,地址族與協(xié)議族相同。b.參數(shù)type指定Socket類(lèi)型,對(duì)于1.1版本的Socket,它只支持兩種類(lèi)型的套接字,SOCK_STREAM指定產(chǎn)生流式套接字,SOCK_DGRAM產(chǎn)生數(shù)據(jù)報(bào)套接字。c.參數(shù)protocol與特定的地址家族相關(guān)的協(xié)議,如果指定為0,那么他就會(huì)根據(jù)地址格式和套接字類(lèi)別,自動(dòng)為你選擇一個(gè)合適的協(xié)議。這是推薦使用的一種選擇協(xié)議的方式。2.4.3. int bin

13、d(SOCKET s,const struct sockaddr FAR *name,int namelen) :a.第一個(gè)參數(shù)指定要綁定的套接字,第二個(gè)參數(shù)指定該套接字的本地地址信息,是指向sockaddr結(jié)構(gòu)的指針變量,由于該地址結(jié)構(gòu)是為了所有的地址家族準(zhǔn)備使用的,這個(gè)結(jié)構(gòu)可能(通常會(huì))隨使用的網(wǎng)絡(luò)協(xié)議不同而不同,所以,要用第三個(gè)參數(shù)指定該地址結(jié)構(gòu)的長(zhǎng)度。sockaddr機(jī)構(gòu)定義如下:struct sockaddru_short sa_family;char sa_data14;b.上述結(jié)構(gòu)第一個(gè)字段指定該地址家族,在這里必須設(shè)為AF_INET。sa_data僅僅是表示要求一塊內(nèi)存分配區(qū),

14、起到占位的作用,該區(qū)域中指定與協(xié)議相關(guān)的具體地址信息。由于實(shí)際要求的只是內(nèi)存區(qū),所以對(duì)于不同的協(xié)議家族,用不同的結(jié)構(gòu)來(lái)替換sockaddr。在TCP/IP中,我們可以用SOCKADDR_IN結(jié)構(gòu)來(lái)代替sockaddr,以方便我們填寫(xiě)地址信息。c.struct SOCKADDR_INshortsin_family;unsigned shortsin_port;structin_addrsin_addr;charsin_zero8;sin_family表示地址族,對(duì)于IP地址,sin_family成員將一直是AF_INET;成員sin_port指定的將要分配給套接字的端口;成員sin_addr給出

15、的是套接字的主機(jī)IP地址;sin_zero只是一個(gè)填充數(shù),以使sockaddr_in結(jié)構(gòu)和sockaddr結(jié)構(gòu)的長(zhǎng)度一樣,一般不用設(shè)置。除了sin_family外,SOCKADDR_IN其他成員是按網(wǎng)絡(luò)字節(jié)順序表示的。所以需要進(jìn)行轉(zhuǎn)換:htonl(INADDR_ANY),htons(6000),其中6000是端口號(hào)。另外結(jié)構(gòu)體的名稱(chēng)大寫(xiě)和小寫(xiě)指的是同一個(gè)。將IP地址指定為INADDR_ANY,允許套接字向任何分配給本機(jī)器的IP地址發(fā)送或接收數(shù)據(jù)。一般一臺(tái)機(jī)器一個(gè)網(wǎng)卡,但對(duì)于多網(wǎng)卡的機(jī)器,INADDR_ANY將簡(jiǎn)化應(yīng)用程序的編寫(xiě)。將地址指定為INADDR_ANY,允許一個(gè)獨(dú)立的應(yīng)用接受發(fā)自多個(gè)接

16、口的回應(yīng)。如果我們只想讓套接字使用多個(gè)IP中的一個(gè)地址,必須指定實(shí)際地址,要做到這一點(diǎn),可以用inet_addr()函數(shù),這個(gè)函數(shù)需要一個(gè)IP地址(如8),返回一個(gè)適合分配給S_addr的u_long類(lèi)型的數(shù)值。Inet_ntoa()函數(shù)完成相反的轉(zhuǎn)換,它接受一個(gè)in_addr結(jié)構(gòu)體類(lèi)型的參數(shù)并返回一個(gè)以點(diǎn)分十進(jìn)制的IP地址字符串。htonl把一個(gè)u_long類(lèi)型從主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序。htons把一個(gè)u_short類(lèi)型從主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序。2.4.4.send函數(shù):向客戶(hù)端發(fā)送指定信息2.4.5.recv函數(shù):得到從客戶(hù)端傳遞過(guò)來(lái)的信息2.4.6.clo

17、sesocket(SOCKET s):將指定的套接字關(guān)閉,從而釋放資源2.4.7.WSACleanup():終止對(duì)winsocket庫(kù)的使用3.程序調(diào)試與編譯運(yùn)行結(jié)果3.1程序調(diào)試按照設(shè)計(jì)要求編寫(xiě)好程序后,開(kāi)始對(duì)程序進(jìn)行調(diào)試,由于程序不是很長(zhǎng),因此調(diào)試過(guò)程也較為順利,不過(guò)在調(diào)試過(guò)程中還是遇到了不少問(wèn)題:3.1.1.由于對(duì)socket編程不熟悉,開(kāi)始時(shí)環(huán)境變量沒(méi)有設(shè)置好,編譯時(shí)總是出現(xiàn)error LNK2001;經(jīng)過(guò)查資料得知是因?yàn)闆](méi)有在環(huán)境變量設(shè)置中添加 “ws2_32.lib”,添加后編譯就不會(huì)出現(xiàn)上面的錯(cuò)誤了;3.2.2.由于對(duì)socket的庫(kù)函數(shù)不熟悉,對(duì)其中的各種函數(shù)誤用,導(dǎo)致程序出錯(cuò)

18、;3.2程序編譯運(yùn)行 調(diào)試好程序后,對(duì)其進(jìn)行編譯運(yùn)行,其運(yùn)行結(jié)果如下:圖3-1 客戶(hù)端發(fā)送數(shù)據(jù),服務(wù)器接收到數(shù)據(jù)圖3-2服務(wù)器向客戶(hù)端回復(fù)數(shù)據(jù),客戶(hù)端接收到數(shù)據(jù)4.設(shè)計(jì)總結(jié)與體會(huì) 本課程設(shè)計(jì)設(shè)計(jì)了一個(gè)基于UDP的客戶(hù)/服務(wù)器通信程序,并用C+語(yǔ)言編程實(shí)現(xiàn)了基本功能,該程序能實(shí)現(xiàn)從客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù),服務(wù)器能接收并正確顯示客戶(hù)端的IP地址和端口以及接收到的數(shù)據(jù),而且還能向客戶(hù)端發(fā)送數(shù)據(jù),客戶(hù)端也能正確接收并顯示出來(lái)。通過(guò)本次課程設(shè)計(jì),我對(duì)通過(guò)socke編程有了進(jìn)一步的理解,也學(xué)到了很多知識(shí),對(duì)通信的底層知識(shí)有了進(jìn)一步的了解,并對(duì)UDP協(xié)議的通信有了深刻的理解,之前只知道有UDP這個(gè)協(xié)議,不知

19、道他的原理,現(xiàn)在通過(guò)本次設(shè)計(jì),明白了UDP通信的原理以及如何通過(guò)編程來(lái)實(shí)現(xiàn)??傊@次課設(shè)我收獲很大。參考文獻(xiàn)1陳偉,劉會(huì)衡.計(jì)算機(jī)網(wǎng)絡(luò)與通信.北京:電子工業(yè)出版社,2010.2謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(5).北京:電子工業(yè)出版社,2008.3楊家海.網(wǎng)絡(luò)管理原理與實(shí)用技術(shù).北京:清華大學(xué)出版社,2002.4王艷平.windows網(wǎng)絡(luò)與通信程序設(shè)計(jì).北京:人民郵電出版社,2009.5李媛媛.Visaul C+網(wǎng)絡(luò)通信開(kāi)發(fā)入門(mén)與編程實(shí)踐.北京:電子工業(yè)出版社,2008. 在VC中的工程設(shè)置中的連接下面的ws2_32.lib,否則程序運(yùn)行錯(cuò)誤客戶(hù)端源程序#include winsock2.h#includ

20、e stdio.hvoid main() /加載套接字(winsock)庫(kù),加載這段代碼拷貝于MSDN中WSAStartup的介紹 WORD wVersionRequested;/定義一個(gè)unsigned short類(lèi)型的變量 WSADATA wsaData;/typedef struct WSAData 定義一個(gè)WSADATA結(jié)構(gòu)體 int err; wVersionRequested = MAKEWORD( 1, 1 ); /版本號(hào)為1.1 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if

21、 ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /創(chuàng)建套接字SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); /SOCK_DGRAM為UDP傳輸方式 /typedef u_int SOCKET; SOCKADDR_IN addrServer; /服務(wù)器地址結(jié)構(gòu) typedef struct sockaddr_in SOCKADDR_IN addrServer.sin_addr.S_un.S_addr=inet_

22、addr(); /服務(wù)器地址 addrServer.sin_family=AF_INET; addrServer.sin_port=htons(6000); /服務(wù)器端口號(hào) char tempBuf1000; char recvBuf1000;/定義接收緩沖數(shù)組 char sendBuf1000;/定義發(fā)送緩沖數(shù)組 int len=sizeof(SOCKADDR);/求SOCKADDR長(zhǎng)度 while(1) printf(plese input the message:n); gets(sendBuf); /得到用戶(hù)的鍵盤(pán)輸入 sendto(sockClient,sendBu

23、f,strlen(sendBuf)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); int result=recvfrom(sockClient,recvBuf,1000,0,(SOCKADDR*)&addrServer,&len); if(result=SOCKET_ERROR) int errCode=WSAGetLastError(); printf(error:%d,errCode); break; /退出循環(huán) else if(recvBuf0=q) /對(duì)方請(qǐng)求退出 /同樣將退出請(qǐng)求發(fā)送回去 sendto(sockClient,q,strlen

24、(q)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); printf(the chat end!); for(int i=0;i65536;i+) for(int j=0;j5000;j+); break; else /將對(duì)方發(fā)送過(guò)來(lái)的信息前段加上IP地址進(jìn)行輸出 sprintf(tempBuf,massege from server aid:%s,recvBuf);/sprintf(tempBuf,%s aid:%s,inet_ntoa(addrServer.sin_addr),recvBuf); printf(%sn,tempBuf); close

25、socket(sockClient); WSACleanup();服務(wù)器源程序#include winsock2.h#include stdio.h void main() /加載套接字(winsock)庫(kù),加載這段代碼拷貝于MSDN中WSAStartup的介紹 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); /版本號(hào)為1.1 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return

26、; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /創(chuàng)建套接字 SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrServer; /設(shè)置服務(wù)器端套接字的地址結(jié)構(gòu)的相關(guān)屬性 addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /設(shè)置IP addrServer.sin_family=AF_INET; addrServer.sin

27、_port=htons(6000); /設(shè)置端口號(hào) /將套接字和服務(wù)器地址結(jié)構(gòu)綁定 bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf100; char tempBuf100; char sendBuf100; while(1) /從客戶(hù)端接收數(shù)據(jù) int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); if(res

28、ult=SOCKET_ERROR) int errCode=WSAGetLastError(); printf(error:%d,errCode); break; /退出循環(huán) else if(recvBuf0=q) /對(duì)方請(qǐng)求退出 /同樣將退出請(qǐng)求發(fā)送回去 sendto(sockServer,q,strlen(q)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR); printf(the chat end!); for(int i=0;i65536;i+) for(int j=0;j5000;j+); break; else /將對(duì)方發(fā)送過(guò)來(lái)的信息前段加

29、上IP地址進(jìn)行輸出/htons(addrCli.sin_port) sprintf(tempBuf,%s %d said:%s,inet_ntoa(addrClient.sin_addr),htons(addrServer.sin_port),recvBuf); printf(%sn,tempBuf); /將用戶(hù)的鍵盤(pán)輸入發(fā)送到對(duì)方 printf(pleas input the message:n); gets(sendBuf); /得到鍵盤(pán)輸入內(nèi)容 sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR); closesocket(sockServer); WSACleanup(); tgKQcWA3PtGZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGshLs5

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論