雷津,趙寅
(1.中船重工第719研究所軍代室,湖北武漢,420060;2.中船重工第719研究所,湖北武漢,420060)
VC++環境下的UDP網絡通信實現
雷津1,趙寅2
(1.中船重工第719研究所軍代室,湖北武漢,420060;2.中船重工第719研究所,湖北武漢,420060)
隨著計算機技術,網絡技術,通信技術的迅速發展,越來越多的網絡信息走入了大眾的生活,對網絡信息的傳輸設計和實現技術要求也越來越高。本文分析了利用套接字實現網絡通信的原理,研究了基于VC的UDP網絡編程的設計與實現。
網絡編程;UDP;同步傳輸
隨著Internet對當今社會日漸重要的作用,Windows下的網絡程序也越來越顯得重要。正確使用Windows Socket,便于不同地址下的進程得以在Windows環境下順利進行各種網絡通信。
Windows Socket(簡稱WinSock)規范是Windows平臺下定義的可以兼容二進制數據傳輸的網絡編程接口,是基于美國加州伯克利分校的BSD UNIX Sockets實現的。此規范包括BSD格式的Sockets函數和Windows擴展函數。它是一個基于Socket模型的API,包括許多為UNIX開發的Berkeley風格的庫函數和針對Windows的擴展庫函數,使程序員能充分地利用Windows消息驅動機制進行編程。WinSock規范定義了一個TCP/IP網絡上開發Windows程序的接口標準,它以DLL來實現Socket接口。WinSock位于TCP/IP協議棧和應用程序的中間,管理與TCP/IP協議的接口。程序利用WinSock及其對底層硬件(串行口或網卡)的控制,來實現網絡通信。MicroSoft公司在此基礎上創建了WinSock控件,專門用于Windows接口,與Sockets完全兼容。
WinSock可以實現很強大的網絡功能,但編程較難,涉及很多的庫函數。在此,用WinSock控件實現網絡通信,可方便地開發各種網絡應用程序。

圖1 C/S請求和應答請求的基本過程
在網絡編程中最常用的方案便是Client/Server (客戶機/服務器)模型[1]。在這種方案中客戶應用程序向服務器程序請求服務。一個服務程序通常在一個眾所周知的地址監聽對服務的請求,也就是說,服務進程一直處于休眠狀態,直到一個客戶向這個服務的地址提出了連接請求。在這個時刻,服務程序被“驚醒”并且為客戶提供服務-對客戶的請求作出適當的反應。通信過程如圖1所示。
套接字(socket)是網絡計算機與應用程序之間發送和接收數據方式的一種抽象描述[2]。用來實現主機和主機通信的一個接口,完成主機間的通信操作。它位于協議之上,屏蔽了底層的協議,能夠實現各種類型的通信操作。它是網絡通信中應用程序對應的進程和網絡協議之間的接口。Socket套接字分為兩種類型,一種是數據報套接字,一種是數據流套接字。
2.1 基于TCP協議的網絡通信
數據流套接字是基于顯式連接的套接字。采用TCP通信協議,提供沒有記錄邊界的雙向字節數據流,具有可靠的發送順序,沒有復制數據。數據流的接收也是可靠的,適合處理大量數據的傳輸。在基于數據流套接字的通信模型中,服務器Socket需要等待客戶端Socket向其提出的建立連接的申請,一旦接收到客戶端的連接請求,服務器返回一個新的套接字描述符,通過該描述符調用數據傳輸函數可以與客戶端進行數據的收發[3]。以此保證通信鏈路的可靠連接及數據傳輸的正確無誤。基于數據流套接字的通信模型如圖2所示。
2.2 基于UDP協議的網絡通信
數據報套接字,即無連接套接字,是不需要連接即可通信的套接字。采用UDP協議,可以向指定的socket發送數據包信息,也可以從指定的sokcet接收消息。提供雙向的面向記錄的數據流,但是不能確保數據傳輸的順序,也不能確保傳輸的可靠性,有時會出現傳輸失敗。

圖2 基于TCP協議的通信模型
基于UDP協議的通信模型相對比較簡單。服務器和客戶端沒有明確的界限,而且是對等的關系。客戶端之間首先創建一個數據報式套接字,并將其綁定到地址和端口上。客戶端與服務端的數據交換通過sendto和recvfrom函數完成,在調用這兩個函數時都指定對方的地址,而不用建立連接。最后,都需要調用closesocket關閉套接字。面向無連接的套接字編程模型下圖3所示。

圖3 基于UDP協議的通信模型
由上節分析可知,UDP是一種面向非連接的,不可靠的通信協議,相對于TCP協議雖在通信可靠性上有所不及,但其傳輸效率高的特點使其在網絡通信上仍有廣泛應用。
服務器端使用ServerSocket監聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產生,在完成會話后,關閉連接。客戶端使用Socket對網絡上某一個服務器的某一個端口發出連接請求,一旦連接成功,打開會話,會話完成后,關閉Socket。客戶端不需要指定打開的端口,通常臨時的,動態的分配一個1024以上的端口[4]。
3.1 網絡通信結構
本文所涉及的網絡通信網絡由兩臺CPU所組成,分別是CPU1(服務器)及CPU2(客戶端),兩臺CPU通過利用基于UDP的網絡通信實現數據的交換。其服務器端CPU的IP地址為127.0.0.1,接收客戶端CPU發送的50字節的數據。

圖4 網絡通信結構
3.2 服務器端編程實現
服務器端的通信步驟為:
(1)加載套接字庫,創建套接字(WSAStartup()/socket());
(2)綁定套接字到一個IP地址和一個端口上(bind());
(3)等待和接收數據(sendto()/recvfrom());
(4)關閉套接字,關閉加載的套接字庫(closesocket()/ WSACleanup())。
現依照上述步驟,編寫服務器端代碼如下:
#include #include void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(1, 1); err=WSAStartup(wVersionRequested, &wsaData); if (err != 0) {return; } if (LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData. wVersion)!=1) {WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); //創建套接字 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(7003); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //綁定套接字 char recvBuf[50]; //定義接收空間 SOCKADDR addrClient; int len=sizeof(SOCKADDR); recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClien t,&len); //接收發送客戶端發送的數據 printf(“%s
”,recvBuf); closesocket(sockSrv); //關閉套接字 WSACleanup(); } 3.3 客戶端編程實現 客戶端的通信步驟為: (1)創建一個套接字socket(); (2)向服務器發送數據sendto();(3)關閉套接字; 具體代碼實現如下: #include #include void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); //創建套接字 if (err!= 0) {return; } i f ( L O B Y T E( w s a D a t a .w V e r s i o n )! = 2||HIBYTE(wsaData.wVersion)!= 2) {WSACleanup( ); return; } SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrClient; addrClient.sin_addr.S_un.S_addr=inet_ addr(“127.0.0.1”); //定義發送對象IP地址 addrClient.sin_family=AF_INET; addrClient.sin_port=htons(8889); SOCKADDR_IN addrSrv; sendto(sockClient,”hi”,3,0,(SOCKADDR*)&addrClient,s izeof(SOCKADDR)); //發送數據 } 論文討論了基于UDP 的Socket編程,如何開發一個Server-Client模型的程序,服務器端編程的步驟,客戶端編程的步驟編程流程,對UDP異步傳輸進行了詳細的系統分析和設計,針對UDP異步傳輸本身的特點和對系統的功能要求,進行了編程實現。 [1]鄭阿奇.Visual C++6.0應用案例教程[M].北京:電子工業出版社,2010:160-170. [2]延霞,謝斐.Visual C++網絡編程技術[M].北京:中國水利水電出版社,2010:6-11. [3]任志考,李朝玲. Visual C++6.0環境下Winsock的研究與應用[J].信息技術.2006,(8):96-99. [4]王理燕,賀利軍.基于VC的UDP的實現[J].信息通信.2008,No.1:20-23. Internet UDP Communication With WinSock Control In VC++ Lei Jin1,Zhao Yan2 With the rapid development of computer technology, network technology, communication technology, more and more network information into the public life of the transmission network design and implementation of information technology requirements are also increasing. This paper analyzes the principle of the use of sockets for network communication, research design and implementation of the VC UDP-based network programming. network technology;UDP;sockets4 結束語
(1.The 719th Research Institute of CSIC Military Representative Office,Wuhan Hubei,420060;2.The 719th Research Institute of CSIC, Wuhan Hubei,420060)