【正文】
) 確定 由服務(wù)器端調(diào)用 b i n d ( ) 時確定 由 a c c e p t ( ) 確定 客戶端五元組 由 s o c k e t ( ) 確定 由客戶端的 b i n d ( ) 調(diào)用確定。如果客戶端沒有進行 b i n d ( ) 調(diào)用,或調(diào)用了 b i n d ( ) 但沒有指定具體地址或端口,則由系統(tǒng)內(nèi)核自動確定地址和 端口 由 c o n n e c t ( ) 確定 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 4. 服務(wù)器與客戶通信過程模型圖 服務(wù)器與客戶進行上述通信的過程可以用圖 71表示 。 要注意的是 , 在客戶端也可以使用 bind( )調(diào)用進行地址綁定 。 圖 71中數(shù)據(jù)的交換部分在實際程序中有多種可能性 , 圖中只給出了一種服務(wù)器端先接收數(shù)據(jù)然后再發(fā)送數(shù)據(jù)的情況 。 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 W SA Sta r tu p ( )s o c k e t( )b in d ( )lis te n ( )a c c e p t( )等 待 客 戶 連 接 請 求 的 到 來r e c v ( )s e n d ( )c lo s e s o c k e t( )W SA C le a n u p ( )用 三 次 握 手 過 程 建 立 T C P 連接s e n d ( )r e c v ( )c lo s e s o c k e t( )W SA C le a n u p ( )關(guān)閉 T C P 連接交 換 數(shù) 據(jù)交 換 數(shù) 據(jù)c o n n e c t( )s o c k e t( )W SA Sta r tu p ( )圖 71 面向連接的客戶 /服務(wù)器程序工作模型 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 無連接的客戶 /服務(wù)器程序工作流程 無連接的數(shù)據(jù)報 (SOCK_DGRAM)傳輸服務(wù)在傳輸層使用 UDP協(xié)議 。 與面向連接的通信過程不同 , 它的最大特點是不需要在客戶和服務(wù)器之間先建立連接 , 通信的任何一方可以先發(fā)送數(shù)據(jù) , 這樣首先發(fā)送數(shù)據(jù)的一方就成了客戶端 , 而接收數(shù)據(jù)的一方就是服務(wù)器端 。 在數(shù)據(jù)傳輸完成后 , 只要關(guān)閉套接口 , 釋放網(wǎng)絡(luò)資源 , 通信過程就結(jié)束了 。 無連接的數(shù)據(jù)報傳輸服務(wù)通信時 , 客戶端與服務(wù)器端所使用的函數(shù)是類似的 。 其工作流程如下: 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 (1) 使用 WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況 。 使用格式為: WSAStartup(0x0202, amp。wsaData); WSAStartup(MAKEWORD(2,2), amp。wsaData); (2) 使用 socket()或 WSASocket()函數(shù)創(chuàng)建套接口 ,以確定相關(guān)五元組的協(xié)議 。 調(diào)用格式有如下幾種: SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); SOCKET s=socket(AF_INET,SOCK_DGRAM,0); SOCKET 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 s=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_TCP,NULL,0, WSA_FLAG_OVERLAPPED); SOCKET s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0, WSA_FLAG_OVERLAPPED); 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 (3) 使用 bind()函數(shù)將創(chuàng)建的套接口與本地地址綁定 。 它確定了相關(guān)五元組中的本地 IP地址和端口號 。 常用格式如下: bind(s,(const struct sockaddr*)amp。localaddr,sizeof(sockaddr)); (4) 使用 sendto()或 WSASendTo()函數(shù)發(fā)送數(shù)據(jù) , 使用recvfrom()或 WSARecvFrom()函數(shù)接收數(shù)據(jù) 。 (5) 使用 closesocket()函數(shù)關(guān)閉套接口 。 (6) 調(diào)用 WSACleanup()函數(shù) , 結(jié)束 Windows Sockets API的使用 。 至此 , 一次無連接的數(shù)據(jù)報傳輸過程結(jié)束 。 無連接的客戶與服務(wù)器之間的交互通信模型可以用圖 72表示 。 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 W SA St a r tu p ( )s o c k e t( )b in d ( )r e c v f r o m ( )s e n d to ( )c lo s e s o c k e t( )W SA C le a n u p ( )交 換 數(shù) 據(jù)交 換 數(shù) 據(jù)W SA St a r tu p ( )s o c k e t( )b in d ( )s e n d to ( )r e c v f r o m ( )c lo s e s o c k e t( )W SA C le a n u p ( )圖 72 無連接的客戶 /服務(wù)器程序工作模型 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 在編寫無連接的客戶 /服務(wù)器程序時 , 應(yīng)該注意以下幾個問題: (1) 通信的一方可以不用 bind( )綁定 IP地址和端口 , 而由系統(tǒng)自動分配 。 (2) 不綁定 IP地址和端口的一方必須首先向綁定地址的一方發(fā)送數(shù)據(jù) 。 (3) 無連接應(yīng)用程序也可以調(diào)用 connect( )函數(shù) , 但是它并不向?qū)Ψ桨l(fā)出建立連接的請求 , 內(nèi)核只是將 connect( )中指定的目標(biāo)方的 IP地址和端口號記錄下來 , 在以后的通信中就可以使用面向連接的數(shù)據(jù)發(fā)送函數(shù) send( )和數(shù)據(jù)接收函數(shù)revc( )。 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 (4) 無連接的數(shù)據(jù)報傳輸過程中 , 作為服務(wù)器的一方也必須先啟動 , 否則客戶請求傳不到服務(wù)進程 。 (5) 由于無連接的客戶端一般不調(diào)用 connect( ), 因此在數(shù)據(jù)發(fā)送之前 , 客戶與服務(wù)器之間尚未建立一個全相關(guān) (五元組 ), 但各自通過 socket( )和 bind( )調(diào)用建立了半相關(guān) 。 發(fā)送數(shù)據(jù)時 , 發(fā)送方除指定本地套接口的地址外 ,還需指定接收方套接口的地址 , 從而在數(shù)據(jù)收發(fā)過程中動態(tài)地建立全相關(guān) 。 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 基于 TCP的客戶 /服務(wù)器通信程序?qū)嵗? 實例程序說明 實例程序使用的編程環(huán)境為當(dāng)前常用的 Visual C++。為了便于大家理解用 Socket進行網(wǎng)絡(luò)程序設(shè)計的原理 , 本程序使用了 Visual C++ “ Win32 Console Application”。 控制臺程序的結(jié)構(gòu)一目了然 , 使程序中各種Winsock API調(diào)用都非常清楚 。 該程序中通信協(xié)議使用的是面向連接的 TCP協(xié)議(SOCK_STREAM)。 服務(wù)器端的 IP地址使用系統(tǒng)指定的 IP地址 , 端口號在程序中指定為 5050, 用符號常量來定義 。 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 服務(wù)器端程序 /************************************************************************* 調(diào)試環(huán)境: Visual C++ 服務(wù)器 IP地址:由系統(tǒng)指定 服務(wù)器端口號: 5050 程序名稱: 程序功能:服務(wù)器端的程序當(dāng)有客戶提出連接請求時 , 在端口 5050與客戶端進行 TCP連接 , 第 7章 TCP/IP網(wǎng)絡(luò)程序框架與實例 連接成功后 , 顯示客戶 IP地址和端口號 , 并給客戶端發(fā)送 Hello! I am a server. 字符串 。 如果發(fā)送正確則顯示所發(fā)送的字節(jié)數(shù) 命令格式: server ****************************************************************