黑龍江 徐鑒
網(wǎng)絡(luò)通信編程教學(xué)設(shè)計(jì)與實(shí)現(xiàn)
黑龍江 徐鑒
交互性是程序設(shè)計(jì)最大特性,而使用網(wǎng)絡(luò)通信技術(shù)是實(shí)現(xiàn)交互性的真正后臺工具。本文介紹了VC++實(shí)現(xiàn)網(wǎng)絡(luò)通信編程技術(shù)在教學(xué)中的實(shí)現(xiàn)。它是實(shí)現(xiàn)不同客戶進(jìn)行數(shù)據(jù)交互、網(wǎng)絡(luò)通信的主要工具,并實(shí)現(xiàn)了多客戶間的實(shí)時(shí)聊天。
交互性;VC++;網(wǎng)絡(luò)通信
網(wǎng)絡(luò)通信主要是在發(fā)送端把信息通過規(guī)定好的協(xié)議進(jìn)行組裝包,在接收端按照規(guī)定好的協(xié)議把包進(jìn)行解析,從而提取出對應(yīng)的信息,達(dá)到通信的目的。中間最主要的就是數(shù)據(jù)包的組裝、過濾、捕獲和分析等處理。
(1)Internet網(wǎng)絡(luò)模型
網(wǎng)絡(luò)模型:網(wǎng)絡(luò)的結(jié)構(gòu)原理和工作原理
OSI參考模型:七層
Internet網(wǎng)絡(luò)模型:四層
網(wǎng)絡(luò)協(xié)議:指定層上進(jìn)行數(shù)據(jù)交換的規(guī)則
Internet的網(wǎng)絡(luò)層協(xié)議:IP協(xié)議;DNS協(xié)議 (輔助協(xié)議)
Internet的傳輸層協(xié)議:TCP協(xié)議;UDP協(xié)議
(2)套接字基礎(chǔ)
套接字(Sockets):應(yīng)用程序和網(wǎng)絡(luò)協(xié)議的接口
TCPSockets:使用TCP協(xié)議實(shí)現(xiàn)可靠的網(wǎng)絡(luò)通信
UDPSockets:使用UDP協(xié)議實(shí)現(xiàn)效率較高的網(wǎng)絡(luò)通信
(3)Visual C++
VisualC++是一個(gè)功能強(qiáng)大的、完全可擴(kuò)展的Windows開發(fā)系統(tǒng)。具有強(qiáng)有力的Internet支持,同時(shí)WinSock規(guī)范給應(yīng)用程序開發(fā)提供了一套簡單的API,并制定了相應(yīng)規(guī)范。
1Socket概論
Socket在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過它與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,與使用文件句柄相似,可以對Socket句柄進(jìn)行讀、寫操作。將Socket翻譯為套接字,具體分為以下三種類型:
字節(jié)流套接字(StreamSocket) 它提供面向連接的、無差錯(cuò)的、先后順序一致的、無記錄邊界和非重復(fù)的網(wǎng)絡(luò)信包傳輸。是最常用的套接字類型,TCP/IP協(xié)議族中的TCP協(xié)議使用此類接口。
數(shù)據(jù)報(bào)套接字(DatagramSocket) 它是無連接的服務(wù),它以獨(dú)立的信包進(jìn)行網(wǎng)絡(luò)傳輸,信包最大長度為32KB,傳輸不保證順序性、可靠性和無重復(fù)性,它通常用于單個(gè)報(bào)文傳輸或可靠性不重要的場合。TCP/IP協(xié)議族中的UDP協(xié)議使用此類接口,原始數(shù)據(jù)報(bào)套接字(RawSocket) 提供對網(wǎng)絡(luò)下層通訊協(xié)議(如IP協(xié)議)的直接訪問,它一般不是提供給普通用戶的,主要用于開發(fā)新的協(xié)議或用于提取協(xié)議較隱蔽的功能。
圖1 面向連接協(xié)議的SOCKET編程模型
Socket API函數(shù)集
主要的系統(tǒng)調(diào)用包括:socket()-創(chuàng)建Socket;bind()-將創(chuàng)建的Socket與本地端口綁定;connect()與accept()-建立Socket連接;listen()-服務(wù)器監(jiān)聽是否有連接請求;send()-數(shù)據(jù)的可控緩沖發(fā)送;recv()-可控緩沖接收;closesocket()-關(guān)閉Socket。具體如下:
intbind(intsockfd,structsockaddr*my_addr,int addrlen);
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);
intlisten(intsockfd,intbacklog);
intaccept(intsockfd,void*addr,int*addrlen);
intclose(sockfd);
int send(int sockfd,const void*msg,int len,int flags);
intrecv(intsockfd,void*buf,int len,unsigned int flags);
聊天程序是以客戶端程序登錄服務(wù)器,服務(wù)器提供服務(wù)端連接響應(yīng),就可以與登錄在同一服務(wù)器上的用戶交談。因此,程序要在TCP/IP環(huán)境下實(shí)現(xiàn)服務(wù)器端和客戶端兩部分程序。
(1)服務(wù)器端工作流程:服務(wù)器端通過socket()調(diào)用創(chuàng)建一個(gè)Socket數(shù)組后,與指定的本地端口綁定bind(),就可以在端口進(jìn)行偵聽listen()。如果有客戶端連接請求,則選擇一個(gè)空Socket,將客戶端地址賦給這個(gè)Socket。然后登錄成功的客戶就可以聊天。
(2)客戶端工作流程:客戶端程序相對簡單,只需要建立一個(gè)Socket與服務(wù)器端連接,成功后通過這個(gè)Socket來發(fā)送和接收數(shù)據(jù)。
(1)服務(wù)器端代碼
voidCChatServerDlg::UpdateUser(CClientSocket*pSocket)//聊天用戶Socket信息更新
(2)客戶端代碼
[1]四維科技,等.VisualC++網(wǎng)絡(luò)通信編程實(shí)用案例精選.人民郵電出版社,2006.
[2]李媛媛.VisualC++網(wǎng)絡(luò)通信開發(fā)入門與編程實(shí)踐.電子工業(yè)出版社,2008.
(作者單位:黑龍江省哈爾濱華夏計(jì)算機(jī)職業(yè)技術(shù)學(xué)院)
(編輯 王旸)