版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
摘要基本的網(wǎng)絡(luò)編程都是建立在Winsock基礎(chǔ)上的,作為網(wǎng)絡(luò)編程接口,Winsock屏蔽了網(wǎng)絡(luò)底層的復(fù)雜的協(xié)議和數(shù)據(jù)結(jié)構(gòu),因此,在Win32平臺(tái)上,訪問(wèn)眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是首選接口。用Winsock構(gòu)建一個(gè)網(wǎng)絡(luò)聊天室,有兩種基本的方式:數(shù)據(jù)報(bào)方式和流方式,即面向無(wú)連接的數(shù)據(jù)報(bào)方式和面向連接的流方式,對(duì)應(yīng)的協(xié)議分別為UDP(UserDatagramProtocol)協(xié)議和TCP(TransportControlProtocol))協(xié)議。本次我們?cè)O(shè)計(jì)的網(wǎng)絡(luò)聊天室是基于UDP協(xié)議的無(wú)連接方式,軟件編程則主要使用Winsock提供的API函數(shù)。關(guān)鍵字:網(wǎng)絡(luò)編程UDP協(xié)議API函數(shù)1設(shè)計(jì)目的與功能要求1.1設(shè)計(jì)目的(1)編寫一個(gè)簡(jiǎn)單的C/S模式的網(wǎng)絡(luò)聊天室軟件(2)進(jìn)一步掌握利用VisualC++進(jìn)行程序設(shè)計(jì)的能力;(3)進(jìn)一步理解和運(yùn)用面向?qū)ο蟪绦蛟O(shè)計(jì)的思想和方法;(4)初步掌握開發(fā)一個(gè)小型實(shí)用系統(tǒng)的基本方法;(5)理解Windows程序的運(yùn)行過(guò)程。1.2網(wǎng)絡(luò)聊天室功能要求 網(wǎng)絡(luò)聊天室系統(tǒng)設(shè)計(jì)完成后,我們可以在一臺(tái)計(jì)算機(jī)上運(yùn)行服務(wù)端程序,然后在另一網(wǎng)絡(luò)的其他計(jì)算機(jī)上運(yùn)行客戶端程序,登錄到服務(wù)器上,各個(gè)客戶之間就可以聊天,或者直接在一臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行服務(wù)器端和客戶端,然后兩者之間進(jìn)行通信。1.2.1服務(wù)器端功能要求(1)初始化socket,創(chuàng)建服務(wù)器端。(2)維護(hù)一個(gè)鏈表,保存所有用戶的IP地址、端口信息。(3)接受用戶傳送來(lái)的聊天信息,然后向鏈表中的所用用戶轉(zhuǎn)發(fā)。(4)接受用戶傳送來(lái)的連接判斷命令,并向用戶發(fā)出響應(yīng)命令。1.2.2客戶端功能要求 客戶端界面上的兩個(gè)文本框,一個(gè)用于顯示接受的聊天信息,一個(gè)用來(lái)接受用戶輸入的聊天信息。當(dāng)按下“發(fā)送”按鈕時(shí)將信息發(fā)送給服務(wù)器。2設(shè)計(jì)原理本次設(shè)計(jì)的題目是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的C/S模式的網(wǎng)絡(luò)聊天室,基于UDP協(xié)議,是不可靠的面向無(wú)連接的方式。設(shè)計(jì)的基本原理也就是UDP編程原理。UDP協(xié)議是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議,又叫用戶數(shù)據(jù)報(bào)協(xié)議。它提供了無(wú)連接的、不可靠的數(shù)據(jù)傳輸服務(wù)。無(wú)連接是指它不像TCP協(xié)議那樣在通信前先于對(duì)方建立連接以確定對(duì)方的狀態(tài)。不可靠是指它直接安裝指定的IP地址和端口號(hào)將數(shù)據(jù)包發(fā)送出去,如果對(duì)方不在線的話數(shù)據(jù)就可能丟失。UDP協(xié)議編程原理如下:2.1服務(wù)器端原理(1)創(chuàng)建套節(jié)字(socket);(2)綁定IP地址和端口(bind);(3)收發(fā)數(shù)據(jù)(sendto/recvfrom);(4)關(guān)閉連接(closesocket)。2.2客戶端原理(1)創(chuàng)建套節(jié)字(socket);(2)收發(fā)數(shù)據(jù)(sendto/recvfrom);(3)關(guān)閉連接(closesocket)。UDP協(xié)議用于發(fā)送和接收數(shù)據(jù)的函數(shù)是sendto和recvfrom。它們的原形如下:intsendto(SOCKETs,//用于發(fā)送數(shù)據(jù)的套節(jié)字ConstcharFAR*buf,//指向發(fā)送數(shù)據(jù)的緩沖區(qū)intlen,//要發(fā)送數(shù)據(jù)的長(zhǎng)度intflags,//一般指定為0//指向一個(gè)包含目標(biāo)地址和端口號(hào)的sockaddr_in結(jié)構(gòu)conststructsockaddr*to,inttolen);//為socket_in的結(jié)構(gòu)大小同樣UDP協(xié)議接收數(shù)據(jù)也需要知道通信對(duì)端的地址信息。intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);2.3網(wǎng)絡(luò)聊天室設(shè)計(jì)流程該程序設(shè)計(jì)使用WindowsSockets編程。在數(shù)據(jù)傳輸協(xié)議中,我們使用UDP協(xié)議,UDP協(xié)議是無(wú)連接的協(xié)議,在服務(wù)器端不調(diào)用listen函數(shù)進(jìn)行監(jiān)聽(tīng),也不調(diào)用accept函數(shù)建立連接,其操作流程圖如下圖3-2所示:首先,用socket函數(shù)建立套接字,然后根據(jù)本地的IP進(jìn)行綁定,然后就可以通過(guò)使用send函數(shù)和reve函數(shù)來(lái)進(jìn)行數(shù)據(jù)的發(fā)送和接收了。利用C語(yǔ)言編寫Windows應(yīng)用程序有兩種方式:一種是WindowsC編程方式,另一種是VisualC++編程方式。在一般情況下,VisualC++編程方式編寫的程序源代碼量小、開發(fā)時(shí)的工作量小、工作難度也較小,但編譯后的代碼量較大,運(yùn)行速度略低;而WindowsC編程方式編寫的程序源代碼量雖然較大,但可執(zhí)行代碼效率高。隨著技術(shù)的進(jìn)步,VisualC++編程方式已被廣泛采用,但象網(wǎng)絡(luò)編程等一些對(duì)速度要求高、對(duì)硬件操作較多的程序,大多數(shù)還是用WindowsC編程方式開發(fā)的。另外,學(xué)習(xí)WindowsC程序設(shè)計(jì),還有助于更深入地了解Windows的內(nèi)幕和WindowsAPI。3實(shí)現(xiàn)過(guò)程設(shè)計(jì)數(shù)據(jù)報(bào)方式又稱無(wú)連接方式,對(duì)應(yīng)的是UDP(UserDatagramProtocol)協(xié)議。這種方式不提供數(shù)據(jù)無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù)并且接收順序混亂,后發(fā)出的報(bào)文可能會(huì)先收到,并且報(bào)文的長(zhǎng)度是有限制的;不過(guò),由于取消了重發(fā)校驗(yàn)機(jī)制,能夠達(dá)到較高的通信速率,可以用于對(duì)數(shù)據(jù)可靠性要求不高的通信,如實(shí)時(shí)的語(yǔ)音、圖像傳送和廣播消息等。和C語(yǔ)言一樣,函數(shù)是WindowsC編程的最基本的單位。不過(guò),WindowsC主要使用API函數(shù),而網(wǎng)絡(luò)編程則主要使用Winsock提供的API函數(shù)。因此,在該網(wǎng)絡(luò)聊天室的設(shè)計(jì)中,我們將采用Winsock編程,而Winsock編程的一般過(guò)程是比較固定的。3.1服務(wù)器端程序設(shè)計(jì)3.1.1Winsock庫(kù)德裝入、初始化和釋放所以的Winsock函數(shù)都是從WS2_32.DLL庫(kù)導(dǎo)出的,VC++在默認(rèn)的情況下并沒(méi)有連接到該庫(kù),如果想使用WinsockAPI,就必須包含相應(yīng)的庫(kù)文件。#pragmacomment(lib,“wsock32.lib”)每一個(gè)使用winsock的應(yīng)用程序,都必須進(jìn)行WSAStart函數(shù)調(diào)用,并且只有在調(diào)用成功之后才能使用其它的winsock網(wǎng)絡(luò)操作函數(shù)。WSAstartup必須是應(yīng)用程序首先調(diào)用的Winsock函數(shù)。它允許應(yīng)用程序指定所需的WindowsSocketsAPI的版本,獲取特定Winsock實(shí)現(xiàn)的詳細(xì)信息。僅當(dāng)這個(gè)函數(shù)成功執(zhí)行之后,應(yīng)用程序才能調(diào)用其他的WinsockAPI函數(shù)。WSAStartup()函數(shù)原形為:intWSAStartup(//應(yīng)用程序支持的最高Winsock庫(kù)版本,高字節(jié)為此版本號(hào),低字節(jié)為主版本號(hào)WORDwVresionRequested//一個(gè)指向WSADATA結(jié)構(gòu)的指針,它用來(lái)返回DLL庫(kù)德詳細(xì)信息。LPWSADATAlpWSAData);每一個(gè)對(duì)WSAStartup的調(diào)用必須對(duì)應(yīng)一個(gè)對(duì)WSAClearnup的調(diào)用,這個(gè)函數(shù)釋放Winsock庫(kù)。intWSAClearnup(void);該過(guò)程的核心程序代碼如下:WORDVersionRequested=MAKEWORD(1,1); WSADATAwsaData; WSAStartup(VersionRequested,&wsaData); //啟動(dòng)winsock服務(wù) if(wsaData.wVersion!=VersionRequested){MessageBox(NULL,"FirstFailed!","Error",0); WSACleanup();}3.1.2套節(jié)字的創(chuàng)建和關(guān)閉Winsock網(wǎng)絡(luò)通信的第一步通常就是調(diào)用socket()函數(shù)。所有的通信在建立之前都有要?jiǎng)?chuàng)建一個(gè)Socket。該函數(shù)的功能與文件操作中的fopen()類似,返回值是由Winsock定義的一種數(shù)據(jù)類型SOCKET,它實(shí)際是一個(gè)整型數(shù)據(jù),是Socket創(chuàng)建成功時(shí),Windows分配給程序的Socket編號(hào),后面調(diào)用傳輸函數(shù)時(shí),可以把它像文件指針樣引用。使用套節(jié)字之前,必須調(diào)用socket函數(shù)創(chuàng)建一個(gè)套節(jié)字對(duì)象,此函數(shù)調(diào)用成功將返回套節(jié)字的句柄。Socket()函數(shù)的原形如下:SOCKETsocket(intaf,//用來(lái)指定套節(jié)字使用的地址格式,WinSock中只支持AF_INETinttype,//用來(lái)指定套節(jié)字的類型//配合type參數(shù)使用,用來(lái)指定使用的協(xié)議類型,可以是IPPROTO_TCP等intprotocol);type參數(shù)用來(lái)指定套節(jié)字的類型。套節(jié)字有流套節(jié)字、數(shù)據(jù)報(bào)套節(jié)字和原始套節(jié)字等,下面是常見(jiàn)的幾種套節(jié)字類型定義:SOCK_STREAM流套節(jié)字,使用TCP協(xié)議提供有連接的可靠的傳說(shuō)SOCK_DGRAM數(shù)據(jù)報(bào)套節(jié)字,使用UDP協(xié)議提供無(wú)連接的不可靠傳輸SOCK_RAW原始套節(jié)字,Winsock接口并不使用某種特定的協(xié)議去封裝它,而是有程序的自行處理數(shù)據(jù)報(bào)以及協(xié)議首部。當(dāng)type參數(shù)指定為SOCK_STREAM和SOCK_DGRAM時(shí),系統(tǒng)已經(jīng)明確確定使用UDP協(xié)議來(lái)工作,所以protocol參數(shù)可以指定為0。函數(shù)執(zhí)行失敗返回INVYLID_SOCKET(即-1),可以通過(guò)調(diào)用WSAGetLasError取得錯(cuò)誤代碼。當(dāng)不使用socket創(chuàng)建的套節(jié)字時(shí),應(yīng)該調(diào)用closesocket函數(shù)將它關(guān)閉。如果沒(méi)有錯(cuò)誤發(fā)生,函數(shù)返回0,否則返回SOCKET_ERROR。函數(shù)用法如下:intclosesocket(SOCKETs);//函數(shù)唯一的參數(shù)就是關(guān)閉的套節(jié)字的句柄該過(guò)程的核心程序代碼如下:if(ServerSock!=0) { closesocket(ServerSock);//關(guān)閉套接字 ServerSock=0; } if(ServerSock==0) { //創(chuàng)建套接字對(duì)象,數(shù)據(jù)報(bào)套接字,SOCK_STREAM為流套接字 //建立套接字失敗 if((ServerSock=socket(AF_INET,SOCK_DGRAM,0))==SOCKET_ERROR) MessageBox(NULL,"SetSocketFailed!","Error",0); }3.1.3綁定套節(jié)字到指定的IP地址和端口號(hào)成功創(chuàng)建了Socket之后,就應(yīng)該選定通信的對(duì)象。首先是自己的程序要與網(wǎng)上的哪臺(tái)計(jì)算機(jī)通話;其次,在多任務(wù)的系統(tǒng)下,該臺(tái)計(jì)算機(jī)上可能會(huì)有幾個(gè)程序在工作,必須指出要與哪個(gè)程序通信。前者可以通過(guò)IP地址來(lái)確定,而后者則由端口號(hào)來(lái)確定的。為套節(jié)字關(guān)聯(lián)本地地址的函數(shù)是bind,函數(shù)原形如下: intbind(SOCKETs,//套節(jié)字句柄conststructsockaddr*name,//要關(guān)聯(lián)的本地地址intnamelen);//地址的長(zhǎng)度bind函數(shù)用在沒(méi)有建立連接的套節(jié)字上,它的作用是綁定面向連接的或者無(wú)連接的套節(jié)字。當(dāng)一個(gè)套節(jié)字被socket函數(shù)創(chuàng)建之后,它存在于指定的地址家族里,但是它是名命名的。bind函數(shù)通過(guò)安排一個(gè)本地名稱到未命名的socket建立此socket的本地關(guān)聯(lián)。本地名稱包含3個(gè)部分:主機(jī)地址、協(xié)議號(hào)和端口號(hào)。將套節(jié)字與IP地址和端口號(hào)綁定的核心程序代碼:ServerAddr.sin_family=AF_INET; //系統(tǒng)自動(dòng)使用當(dāng)前主機(jī)配置的所有IP地址 ServerAddr.sin_addr.S_un.S_addr=INADDR_ANY; serPort=GetDlgItemInt(hDlg,IDC_Sport,&serErr,TRUE); ServerAddr.sin_port=htons((u_short)serPort);//bind()綁定套接字在指定的端口 if(bind(ServerSock,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR) MessageBox(NULL,"Bind return1;3.1.4設(shè)置套節(jié)字進(jìn)入監(jiān)聽(tīng)狀態(tài)listen函數(shù)置套節(jié)字進(jìn)入監(jiān)聽(tīng)狀態(tài)。intlisten(SOCKETs,//套節(jié)字句柄intbacklog);//監(jiān)聽(tīng)隊(duì)列中允許保持的尚未處理的最大連接數(shù)量為了接受連接,首先使用socket函數(shù)創(chuàng)建一個(gè)套節(jié)字,然后使用bind函數(shù)綁定它到一個(gè)本地地址,再使用listen函數(shù)為到達(dá)的連接指定一個(gè)backlog,最后使用accept接受請(qǐng)求的連接。listen僅應(yīng)用在支持連接的套節(jié)字上,如SOCK_STREAM類型。函數(shù)成功執(zhí)行后,套節(jié)字s進(jìn)入了被動(dòng)模式,到來(lái)的連接會(huì)被通知,排隊(duì)等接受處理。在同一時(shí)間處理對(duì)個(gè)連接請(qǐng)求的服務(wù)器通常使用listen函數(shù):如果一個(gè)連接請(qǐng)求到達(dá),并且排隊(duì)已滿,客戶端將接收WSAECONNREFUSED錯(cuò)誤。在基于UDP協(xié)議的網(wǎng)絡(luò)聊天室設(shè)計(jì)中,不需要listen函數(shù),而這里的listen監(jiān)聽(tīng)知識(shí)綁定一個(gè)端口。其核心代碼如下:ServerSocket=socket(AF_INET,SOCK_DGRAM,0); if(ServerSocket==INVALID_SOCKET) {MessageBox(NULL,”socket創(chuàng)建失敗”,”Error”,0); returnfalse; } srv.sin_family=AF_INET; srv.sin_addr.s_addr=htonl(INADDR_ANY); //任何地址 srv.sin_port=htons(PortNum); if(bind(ServerSocket,(structsockaddr*)&srv,sizeof(srv))!=0) {MessageBox(NULL,”socket綁定端口失敗”,”Error”,0); closesocket(ListenSocket); returnfalse; }3.1.5收發(fā)數(shù)據(jù)對(duì)數(shù)據(jù)報(bào)套節(jié)字來(lái)說(shuō),一般使用sendto和recvfrom函數(shù)來(lái)收發(fā)數(shù)據(jù)。在這次網(wǎng)絡(luò)聊天室的設(shè)計(jì)中,我們采用服務(wù)器只接收數(shù)據(jù)而不進(jìn)行轉(zhuǎn)發(fā)數(shù)據(jù),從而簡(jiǎn)化了部分任務(wù),不過(guò)其核心功能還是實(shí)現(xiàn)的很好。recvfrom()/sendto()的函數(shù)原型如下:intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);使用說(shuō)明:s<輸入>:是連接用的socket。 buf、len<輸入>:發(fā)送或接收的數(shù)據(jù)包字符串的地址和長(zhǎng)度。 flags<輸入>:一般取0。from、fromlen/to、tolen<輸入>:含義和用法與bind()中的相同,分別表示接收和發(fā)送數(shù)據(jù)的對(duì)象。實(shí)現(xiàn)該功能的核心程序代碼入下:caseIDC_receive://接受按鈕的ID號(hào) //接受數(shù)據(jù)的對(duì)象 recvfrom(ServerSock,Output,256,0,(LPSOCKADDR)&ServerAddr,&fromlen); SetDlgItemText(hDlg,IDC_Sedit1,Output); return1;3.1.6關(guān)閉連接這個(gè)模塊主要實(shí)現(xiàn)的功能包括關(guān)閉由socket創(chuàng)建的數(shù)據(jù)報(bào)套節(jié)字、釋放Winsock庫(kù)和清除一個(gè)模態(tài)對(duì)話框,并使系統(tǒng)中止對(duì)對(duì)話框的任何處理。實(shí)現(xiàn)這幾個(gè)功能的函數(shù)為:closesocket()、WSACleanup()和EndDialog()函數(shù)。實(shí)現(xiàn)這些功能的程序代碼如下:caseIDC_closeserver: closesocket(ServerSock); WSACleanup();//釋放Winsock庫(kù)//清除一個(gè)模態(tài)對(duì)話框,并使系統(tǒng)中止對(duì)對(duì)話框的任何處理 EndDialog(hDlg,TRUE); return1;3.2客戶端程序設(shè)計(jì)客戶端程序的設(shè)計(jì)思路和服務(wù)器端有很大的相似之處,只不過(guò)客戶端不需要綁定IP地址和端口號(hào),也不需要進(jìn)行監(jiān)聽(tīng)功能。所以,在總體設(shè)計(jì)上,比服務(wù)器端稍微簡(jiǎn)單一點(diǎn),與服務(wù)器的實(shí)現(xiàn)原理是相同的??蛻舳顺绦虻脑O(shè)計(jì)中也要由socket創(chuàng)建數(shù)據(jù)報(bào)套節(jié)字,還要用sendto()發(fā)送數(shù)據(jù),最后要關(guān)閉套節(jié)字,釋放Winsock庫(kù)。在客戶端,數(shù)據(jù)方式(UDP協(xié)議)構(gòu)建網(wǎng)絡(luò)聊天室程序設(shè)計(jì)中,Winsock庫(kù)德載入和初始化,創(chuàng)建套節(jié)字等功能和服務(wù)器端的完全相同,在這里就不再重復(fù)。不同之處在與客戶端要發(fā)送數(shù)據(jù)而不進(jìn)行接收數(shù)據(jù)。3.2.1發(fā)送數(shù)據(jù)程序設(shè)計(jì)【函數(shù)原型】intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);【使用說(shuō)明】s<輸入>:是連接用的socket。 buf、len<輸入>:發(fā)送或接收的數(shù)據(jù)包字符串的地址和長(zhǎng)度。 flags<輸入>:一般取0。from、fromlen/to、tolen<輸入>:含義和用法與bind()中的相同,分別表示接收和發(fā)送數(shù)據(jù)的對(duì)象。實(shí)現(xiàn)發(fā)送數(shù)據(jù)的核心程序代碼如下:caseIDC_send://發(fā)送按鈕的ID號(hào) ClientAddr.sin_family=AF_INET; ClientAddr.sin_addr.S_un.S_addr=inet_addr(IPStr); ClientPort=GetDlgItemInt(hDlg,IDC_Eport,&bErr,TRUE); ClientAddr.sin_port=htons((u_short)ClientPort); //使用指定的SocketFlags,將指定字節(jié)數(shù)的數(shù)據(jù)發(fā)送到指定的終結(jié)點(diǎn) sendto(ClientSocket,InputText,256,0,(LPSOCKADDR)&ClientAddr,sizeof(ClientAddr)); break;3.2.2幾個(gè)關(guān)鍵結(jié)構(gòu)體的介紹在整個(gè)基于UDP協(xié)議的網(wǎng)絡(luò)聊天室程序設(shè)計(jì)中,我們一直都在使用幾個(gè)比較重要的系統(tǒng)自定義的結(jié)構(gòu)體,我們正是在這些結(jié)構(gòu)體的基礎(chǔ)上進(jìn)行程序設(shè)計(jì),并最終完成網(wǎng)絡(luò)聊天室的設(shè)計(jì)。在這里主要介紹Sockaddr_in結(jié)構(gòu)體和IP地址sin_addr結(jié)構(gòu)體。 Sockaddr_in的定義如下:structsockaddr_in{
shortsin_family;
unsignedshortsin_port;
struct
in_addrsin_addr;
charsin_zero[8];};其中,sin_family是指一套地址族,它指定所要使用的通信協(xié)議,通常設(shè)為AF_INET;sin_port端口號(hào);sin_addr是IP地址;而sin_zero[8]的作用,只是使該結(jié)構(gòu)的大小和SOCKADDR結(jié)構(gòu)大小相同。IP地址sin_addr結(jié)構(gòu)定義如下:structin_addr{union{struct{u_chars_b1,s_b2,s_b3,s_b4;}S_un_b;struct{u_shorts_w1,s_w2;}S_un_w;u_longS_addr; }S_un;};這樣,對(duì)于一個(gè)IP地址,例如“192.168.0.1”,就可以用以下三種方法賦給一個(gè)sockaddr結(jié)構(gòu)體(例如structsockaddr_inm_addr;):方法1:m_addr.sin_addr.S_un.S_un_b.s_b1=192;m_addr.sin_addr.S_un.S_un_b.s_b2=168;m_addr.sin_addr.S_un.S_un_b.s_b3=0;m_addr.sin_addr.S_un.S_un_b.s_b4=1;方法2:m_addr.sin_addr.S_un.S_un_w.s_w1=(168<<8)|192;m_addr.sin_addr.S_un.S_un_w.s_w2=(1<<8)|0;方法3:m_addr.sin_addr.S_un.S_addr=(1<<24)|(0<<16)|(168<<8)|192;為了更方便地賦值,winsock還為我們提供了一個(gè)函數(shù)inet_addr(),可以把用字符串表示的IP地址“192.168.0.1”直接賦給結(jié)構(gòu)體m_addr:char*IP_String=”192.168.0.1”;m_addr.sin_addr.S_un.S_addr=inet_addr(IP_String);4程序界面設(shè)計(jì)4.1服務(wù)器端界面設(shè)計(jì)在服務(wù)器界面中,主要有一個(gè)接收數(shù)據(jù)的窗口,另外還需要建立服務(wù)器的按鈕、建立服務(wù)器的端口號(hào)窗口、關(guān)閉服務(wù)器的按鈕。設(shè)計(jì)服務(wù)器界面是在VistualC++6.0中進(jìn)行的,關(guān)鍵之處在于各個(gè)窗口或者按鈕的ID號(hào)必須與程序中的ID號(hào)對(duì)應(yīng)。設(shè)計(jì)完成后,服務(wù)器端的界面入下:圖4-1服務(wù)器端界面4.2客戶端界面設(shè)計(jì)在客戶端界面中,主要有一個(gè)發(fā)送消息的窗口,另外還包括發(fā)送按鈕、連接服務(wù)器的端口號(hào)、本地計(jì)算機(jī)的IP地址和關(guān)閉客戶端的按鈕。設(shè)計(jì)客戶端的界面基本過(guò)程和思路同設(shè)計(jì)服務(wù)器端的相同,開發(fā)工具都是VistualC++6.0??蛻舳说慕缑嫒缦拢簣D4-2客戶端界面5運(yùn)行結(jié)果分析網(wǎng)絡(luò)聊天室設(shè)計(jì)的預(yù)期目的是能夠在同一臺(tái)計(jì)算機(jī)或者不同的計(jì)算機(jī)上進(jìn)行通信。也就是說(shuō),當(dāng)客戶端向服務(wù)器發(fā)送信息,當(dāng)服務(wù)器端按下接收按鈕時(shí),客戶端所發(fā)送的數(shù)據(jù)能夠被服務(wù)器接收到。而客戶端只負(fù)責(zé)發(fā)送數(shù)據(jù),不考慮所發(fā)數(shù)據(jù)是否能夠可靠的全部被服務(wù)器接收??蛻舳税l(fā)送一條消息,服務(wù)器就接收一條消息時(shí),服務(wù)器端與客戶端的運(yùn)行界面如下所示:客戶端發(fā)送多條消息,而服務(wù)器并沒(méi)有全部接收時(shí),服務(wù)器端與客戶端的運(yùn)行界面如下所示:不過(guò)當(dāng)服務(wù)器按下接收按鈕時(shí),有能夠接收到全部數(shù)據(jù)。6總結(jié)在實(shí)驗(yàn)中,我們可以把這學(xué)期所學(xué)的理論知識(shí)和實(shí)踐聯(lián)系起來(lái),在所要設(shè)計(jì)的程序中漸漸融會(huì)貫通。雖然我們對(duì)這些知識(shí)還運(yùn)用得還不是很熟練,但是相信在現(xiàn)在和今后的學(xué)習(xí)中會(huì)得到更加深刻的掌握。本課程設(shè)計(jì)是設(shè)計(jì)一個(gè)程序,實(shí)現(xiàn)聊天功能,要求有客戶端和服務(wù)器端。通過(guò)設(shè)計(jì)我們進(jìn)一步掌握利用VisualC++進(jìn)行程序設(shè)計(jì)的能力;進(jìn)一步理解和運(yùn)用面向?qū)ο蟪绦蛟O(shè)計(jì)的思想和方法;初步掌握開發(fā)一個(gè)小型實(shí)用系統(tǒng)的基本方法;學(xué)會(huì)調(diào)試一個(gè)較長(zhǎng)程序的基本方法??偟膩?lái)說(shuō)通過(guò)本次實(shí)驗(yàn),我學(xué)習(xí)到了許多東西,增強(qiáng)了一定的實(shí)踐能力。課程設(shè)計(jì)過(guò)程中我們一邊設(shè)計(jì)一邊探索,發(fā)現(xiàn)理論和實(shí)踐要充分地結(jié)合,是需要扎實(shí)的基本功的,這就表明學(xué)好基礎(chǔ)知識(shí)是理論付諸實(shí)踐的前提。參考文獻(xiàn)[1]CharlesPetzold
著,Windows程序設(shè)計(jì).北京博彥科技發(fā)展譯.北京.北京大學(xué)出版社,2021[2]楊祥金,楊丹等.Windows程序設(shè)計(jì)教程.北京:清華大學(xué)出版社,2021[3]王艷平,張錚編著,Windows程序設(shè)計(jì).北京;人民郵電出版社,2021
社會(huì)實(shí)踐報(bào)告系別:班級(jí):學(xué)號(hào):姓名:作為祖國(guó)未來(lái)的事業(yè)的繼承人,我們這些大學(xué)生應(yīng)該及早樹立自己的歷史責(zé)任感,提高自己的社會(huì)適應(yīng)能力。假期的社會(huì)實(shí)踐就是很好的鍛煉自己的機(jī)會(huì)。當(dāng)下,掙錢早已不是打工的唯一目的,更多的人將其視為參加社會(huì)實(shí)踐、提高自身能力的機(jī)會(huì)。許多學(xué)校也積極鼓勵(lì)大學(xué)生多接觸社會(huì)、了解社會(huì),一方面可以把學(xué)到的理論知識(shí)應(yīng)用到實(shí)踐中去,提高各方面的能力;另一方面可以積累工作經(jīng)驗(yàn)對(duì)日后的就業(yè)大有裨益。進(jìn)行社會(huì)實(shí)踐,最理想的就是找到與本專業(yè)對(duì)口單位進(jìn)行實(shí)習(xí),從而提高自己的實(shí)戰(zhàn)水平,同時(shí)可以將課本知識(shí)在實(shí)踐中得到運(yùn)用,從而更好的指導(dǎo)自己今后的學(xué)習(xí)。但是作為一名尚未畢業(yè)的大學(xué)生,由于本身具備的專業(yè)知識(shí)還十分的有限,所以我選擇了打散工作為第一次社會(huì)實(shí)踐的方式。目的在于熟悉社會(huì)。就職業(yè)本身而言,并無(wú)高低貴賤之分,存在即為合理。通過(guò)短短幾天的打工經(jīng)歷可以讓長(zhǎng)期處于校園的我們對(duì)社會(huì)有一種更直觀的認(rèn)識(shí)。實(shí)踐過(guò)程:自從走進(jìn)了大學(xué),就業(yè)問(wèn)題就似乎總是圍繞在我們的身邊,成了說(shuō)不完的話題。在現(xiàn)今社會(huì),招聘會(huì)上的大字報(bào)都總寫著“有經(jīng)驗(yàn)者優(yōu)先”,可還在校園里面的我們這班學(xué)子社會(huì)經(jīng)驗(yàn)又會(huì)擁有多少呢?為了拓展自身的知識(shí)面,擴(kuò)大與社會(huì)的接觸面,增加個(gè)人在社會(huì)競(jìng)爭(zhēng)中的經(jīng)驗(yàn),鍛煉和提高自己的能力,以便在以后畢業(yè)后能真正真正走入社會(huì),能夠適應(yīng)國(guó)內(nèi)外的經(jīng)濟(jì)形勢(shì)的變化,并且能夠在生活和工作中很好地處理各方面的問(wèn)題,我開始了我這個(gè)假期的社會(huì)實(shí)踐-走進(jìn)天源休閑餐廳。實(shí)踐,就是把我們?cè)趯W(xué)校所學(xué)的理論知識(shí),運(yùn)用到客觀實(shí)際中去,使自己所學(xué)的理論知識(shí)有用武之地。只學(xué)不實(shí)踐,那么所學(xué)的就等于零。理論應(yīng)該與實(shí)踐相結(jié)合。另一方面,實(shí)踐可為以后找工作打基礎(chǔ)。通過(guò)這段時(shí)間的實(shí)習(xí),學(xué)到一些在學(xué)校里學(xué)不到的東西。因?yàn)榄h(huán)境的不同,接觸的人與事不同,從中所學(xué)的東西自然就不一樣了。要學(xué)會(huì)從實(shí)踐中學(xué)習(xí),從學(xué)習(xí)中實(shí)踐。而且在中國(guó)的經(jīng)濟(jì)飛速發(fā)展,又加入了世貿(mào),國(guó)內(nèi)外經(jīng)濟(jì)日趨變化,每天都不斷有新的東西涌現(xiàn),在擁有了越來(lái)越多的機(jī)會(huì)的同時(shí),也有了更多的挑戰(zhàn),前天才剛學(xué)到的知識(shí)可能在今天就已經(jīng)被淘汰掉了,中國(guó)的經(jīng)濟(jì)越和外面接軌,對(duì)于人才的要求就會(huì)越來(lái)越高,我們不只要學(xué)好學(xué)校里所學(xué)到的知識(shí),還要不斷從生活中,實(shí)踐中學(xué)其他知識(shí),不斷地從各方面武裝自已,才能在競(jìng)爭(zhēng)中突出自已,表現(xiàn)自已。在餐廳里,別人一眼就能把我人出是一名正在讀書的學(xué)生,我問(wèn)他們?yōu)槭裁?他們總說(shuō)從我的臉上就能看出來(lái),也許沒(méi)有經(jīng)歷過(guò)社會(huì)的人都有我這種不知名遭遇吧!我并沒(méi)有因?yàn)槲以谒麄兠媲皼](méi)有經(jīng)驗(yàn)而退后,我相信我也能做的像他們一樣好.我的工作是在那做傳菜生,每天9點(diǎn)鐘-下午2點(diǎn)再?gòu)南挛绲?點(diǎn)-晚上8:30分上班,雖然時(shí)間長(zhǎng)了點(diǎn)但,熱情而年輕的我并沒(méi)有絲毫的感到過(guò)累,我覺(jué)得這是一種激勵(lì),明白了人生,感悟了生活,接觸了社會(huì),了解了未來(lái).在餐廳里雖然我是以傳菜為主,但我不時(shí)還要做一些工作以外的事情,有時(shí)要做一些清潔的工作,在學(xué)校里也許有老師分配說(shuō)今天做些什么,明天做些什么,但在這里,不一定有人會(huì)告訴你這些,你必須自覺(jué)地去做,而且要盡自已的努力做到最好,一件工作的效率就會(huì)得到別人不同的評(píng)價(jià)。在學(xué)校,只有學(xué)習(xí)的氛圍,畢竟學(xué)校是學(xué)習(xí)的場(chǎng)所,每一個(gè)學(xué)生都在為取得更高的成績(jī)而努力。而這里是工作的場(chǎng)所,每個(gè)人都會(huì)為了獲得更多的報(bào)酬而努力,無(wú)論是學(xué)習(xí)還是工作,都存在著競(jìng)爭(zhēng),在競(jìng)爭(zhēng)中就要不斷學(xué)習(xí)別人先進(jìn)的地方,也要不斷學(xué)習(xí)別人怎樣做人,以提高自已的能力!記得老師曾經(jīng)說(shuō)過(guò)大學(xué)是一個(gè)小社會(huì),但我總覺(jué)得校園里總少不了那份純真,那份真誠(chéng),盡管是大學(xué)高校,學(xué)生還終歸保持著學(xué)生的身份。而走進(jìn)企業(yè),接觸各種各樣的客戶、同事、上司等等,關(guān)系復(fù)雜,但我得去面對(duì)我從未面對(duì)過(guò)的一切。記得在我校舉行的招聘會(huì)上所反映出來(lái)的其中一個(gè)問(wèn)題是,學(xué)生的實(shí)際操作能力與在校理論學(xué)習(xí)有一定的差距。在這次實(shí)踐中,這一點(diǎn)我感受很深。在學(xué)校,理論的學(xué)習(xí)很多,而且是多方面的,幾乎是面面俱到;而在實(shí)際工作中,可能會(huì)遇到書本上沒(méi)學(xué)到的,又可能是書本上的知識(shí)一點(diǎn)都用不上的情況?;蛟S工作中運(yùn)用到的只是很簡(jiǎn)單的問(wèn)題,只要套公式似的就能完成一項(xiàng)任務(wù)。有時(shí)候我會(huì)埋怨,實(shí)際操作這么簡(jiǎn)單,但為什么書本上的知識(shí)讓人學(xué)得這么吃力呢?這是社會(huì)與學(xué)校脫軌了嗎?也許老師是正確的,雖然大學(xué)生生活不像踏入社會(huì),但是總算是社會(huì)的一個(gè)部分,這是不可否認(rèn)的事實(shí)。但是有時(shí)也要感謝老師孜孜不倦地教導(dǎo),有些問(wèn)題有了有課堂上地認(rèn)真消化,有平時(shí)作業(yè)作補(bǔ)充,我比一部人具有更高的起點(diǎn),有了更多的知識(shí)層面去應(yīng)付各種工作上的問(wèn)題,作為一名大學(xué)生,應(yīng)該懂得與社會(huì)上各方面的人交往,處理社會(huì)上所發(fā)生的各方面的事情,這就意味著大學(xué)生要注意到社會(huì)實(shí)踐,社會(huì)實(shí)踐必不可少。畢竟,很快我就不再是一名大學(xué)生,而是社會(huì)中的一分子,要與社會(huì)交流,為社會(huì)做貢獻(xiàn)。只懂得紙上談兵是遠(yuǎn)遠(yuǎn)不及的,以后的人生旅途是漫長(zhǎng)的,為了鍛煉自己成為一名合格
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Module 3 單元整體(說(shuō)課稿)-2024-2025學(xué)年外研版(三起)英語(yǔ)六年級(jí)上冊(cè)
- Revision 第1課時(shí)(說(shuō)課稿)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 四年級(jí)數(shù)學(xué)(小數(shù)加減運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案匯編
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)匯編
- 教育領(lǐng)域?qū)嶒?yàn)儀器的創(chuàng)新與發(fā)展
- 二零二五版房地產(chǎn)投資信托基金還款協(xié)議范本3篇
- 2025年外研版八年級(jí)科學(xué)下冊(cè)階段測(cè)試試卷含答案
- 工程分包安全生產(chǎn)合同
- 2025年滬教版九年級(jí)科學(xué)下冊(cè)月考試卷含答案
- 上海交通大學(xué)思源計(jì)劃項(xiàng)目協(xié)議書
- 不同茶葉的沖泡方法
- 光伏發(fā)電并網(wǎng)申辦具體流程
- 基本藥物制度政策培訓(xùn)課件
- 2025年中國(guó)華能集團(tuán)限公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 建筑勞務(wù)專業(yè)分包合同范本(2025年)
- GB/T 45002-2024水泥膠砂保水率測(cè)定方法
- 廣東省廣州海珠區(qū)2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 飛行原理(第二版) 課件 第10章 高速空氣動(dòng)力學(xué)基礎(chǔ)
- 廣西《乳腺X射線數(shù)字化體層攝影診療技術(shù)操作規(guī)范》
- 山西省2024年中考道德與法治真題試卷(含答案)
- 五年(2020-2024)高考地理真題分類匯編(全國(guó)版)專題12區(qū)域發(fā)展解析版
評(píng)論
0/150
提交評(píng)論