黑龍江 徐鑒
網絡通信編程教學設計與實現(xiàn)
黑龍江 徐鑒
交互性是程序設計最大特性,而使用網絡通信技術是實現(xiàn)交互性的真正后臺工具。本文介紹了VC++實現(xiàn)網絡通信編程技術在教學中的實現(xiàn)。它是實現(xiàn)不同客戶進行數據交互、網絡通信的主要工具,并實現(xiàn)了多客戶間的實時聊天。
交互性;VC++;網絡通信
網絡通信主要是在發(fā)送端把信息通過規(guī)定好的協(xié)議進行組裝包,在接收端按照規(guī)定好的協(xié)議把包進行解析,從而提取出對應的信息,達到通信的目的。中間最主要的就是數據包的組裝、過濾、捕獲和分析等處理。
(1)Internet網絡模型
網絡模型:網絡的結構原理和工作原理
OSI參考模型:七層
Internet網絡模型:四層
網絡協(xié)議:指定層上進行數據交換的規(guī)則
Internet的網絡層協(xié)議:IP協(xié)議;DNS協(xié)議 (輔助協(xié)議)
Internet的傳輸層協(xié)議:TCP協(xié)議;UDP協(xié)議
(2)套接字基礎
套接字(Sockets):應用程序和網絡協(xié)議的接口
TCPSockets:使用TCP協(xié)議實現(xiàn)可靠的網絡通信
UDPSockets:使用UDP協(xié)議實現(xiàn)效率較高的網絡通信
(3)Visual C++
VisualC++是一個功能強大的、完全可擴展的Windows開發(fā)系統(tǒng)。具有強有力的Internet支持,同時WinSock規(guī)范給應用程序開發(fā)提供了一套簡單的API,并制定了相應規(guī)范。
1Socket概論
Socket在計算機中提供了一個通信端口,可以通過它與任何一個具有Socket接口的計算機通信。應用程序在網絡上傳輸,與使用文件句柄相似,可以對Socket句柄進行讀、寫操作。將Socket翻譯為套接字,具體分為以下三種類型:
字節(jié)流套接字(StreamSocket) 它提供面向連接的、無差錯的、先后順序一致的、無記錄邊界和非重復的網絡信包傳輸。是最常用的套接字類型,TCP/IP協(xié)議族中的TCP協(xié)議使用此類接口。
數據報套接字(DatagramSocket) 它是無連接的服務,它以獨立的信包進行網絡傳輸,信包最大長度為32KB,傳輸不保證順序性、可靠性和無重復性,它通常用于單個報文傳輸或可靠性不重要的場合。TCP/IP協(xié)議族中的UDP協(xié)議使用此類接口,原始數據報套接字(RawSocket) 提供對網絡下層通訊協(xié)議(如IP協(xié)議)的直接訪問,它一般不是提供給普通用戶的,主要用于開發(fā)新的協(xié)議或用于提取協(xié)議較隱蔽的功能。

圖1 面向連接協(xié)議的SOCKET編程模型
Socket API函數集
主要的系統(tǒng)調用包括:socket()-創(chuàng)建Socket;bind()-將創(chuàng)建的Socket與本地端口綁定;connect()與accept()-建立Socket連接;listen()-服務器監(jiān)聽是否有連接請求;send()-數據的可控緩沖發(fā)送;recv()-可控緩沖接收;closesocket()-關閉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);
聊天程序是以客戶端程序登錄服務器,服務器提供服務端連接響應,就可以與登錄在同一服務器上的用戶交談。因此,程序要在TCP/IP環(huán)境下實現(xiàn)服務器端和客戶端兩部分程序。
(1)服務器端工作流程:服務器端通過socket()調用創(chuàng)建一個Socket數組后,與指定的本地端口綁定bind(),就可以在端口進行偵聽listen()。如果有客戶端連接請求,則選擇一個空Socket,將客戶端地址賦給這個Socket。然后登錄成功的客戶就可以聊天。
(2)客戶端工作流程:客戶端程序相對簡單,只需要建立一個Socket與服務器端連接,成功后通過這個Socket來發(fā)送和接收數據。
(1)服務器端代碼
voidCChatServerDlg::UpdateUser(CClientSocket*pSocket)//聊天用戶Socket信息更新


(2)客戶端代碼

[1]四維科技,等.VisualC++網絡通信編程實用案例精選.人民郵電出版社,2006.
[2]李媛媛.VisualC++網絡通信開發(fā)入門與編程實踐.電子工業(yè)出版社,2008.
(作者單位:黑龍江省哈爾濱華夏計算機職業(yè)技術學院)
(編輯 王旸)