?? 14.5.2 客戶端程序.txt
字號:
14.5.2 客戶端程序
現在編寫基于 UDP的網絡客戶端應用程序,與上面基于 TCP的網絡應用程序一樣,這里也在同一
個 UdpSrv工作區中創建客戶端應用程序。同樣,創建一個空的 Win32 ConsoleWin32 Console
Application類型的工程,名稱為: UdpClient。然后為該工程添加一個 C++源文件:
UdpClient.cpp,然后在此文件中添加實現基于 UDP的網絡客戶端程序的代碼,結果如例 14-4
所示。
例 14-4
#include <Winsock2.h>
#include <stdio.h>
void tnain ( )
{
11加載套接字庫
WORD wVersionRequested:
WSADATA wsaData:
int err:
wVersionRequested = MAKEWORD( 1 , 1 }:
err = WSAStartup( wVersionRequested, &wsaData }:
if ( err ! = 0 ) {
return;
if ( LOBYTE( wsaData.wVersion ) != 1 II
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
//創建套接字
SOCKET sockClient=socket(AF_工NET,SOCK_DGRAM, 0) ;
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrsrv.sin_family=AF_工NET;
addrSrv.sin-por t=htons(6000) ;
//發送數據
sendto (sockClient , "Hello" , strlen( "Hello") +1, 0,
(SOCKADDR*)&addrSrv , sizeof(SOCKADDR)) ;
//關閉套接字
closesocket(sockClient);
WSACleanup();
同樣,因為在利用套接字編寫網絡應用程序時,都需要套接字庫,所以這部分代碼可以重用。因
此可以直接復制上面程序中己有的這部分代碼。然后按照上面介紹的基于UDP(面向無連接)的
socket編程的客戶端程序流程完成該程序。
llJ創建套接宇 (socket)。同樣,首先需要調用socket創建套接字,第一個參數只能是AF_INET(或
PF一副ET);第二個參數是套接宇類型應該是SOCK_DGRAM;第三個參數指定為0。
(I)向服務器發送數據 (sendto)。
當創建完套接字之后,因為對基于 UDP的客戶端程序來說,也不需要將套接字綁定到本地的P地
址和端口號上,可以直接發送數據,這需要調用 sendto函數。所以,首先定義一個地址結構類
型的變量: sockClient.并給其成員賦值。首先利用 inet-addr函數將點分十進制格式表示的F
地址轉換為u_long類型的數值,同樣,因為是在同一臺機器上運行服務器端程序和客戶端程序,
所以, JP地址可以設置為 127.0.0.1。如果是兩臺機器上分別運行服務器端程序和客戶端程序,
這時就應該是服務器程序運行所在的機器的 E地址。另外,端口應設置為服務器端等待請求的端
口號,本例是6∞0。
接下來,調用sendto函數發送一個簡單的字符串: Hello.并且多發送一個字節,主要
是為了服務器端接收到該數據后可以將最后一個元素設置為'飛O'.表示字符串的結尾。由關閉套
接字。數據發送完成之后,調用closesocket函數關閉套接字的使用。最后,調用WSACleanup
函數,終止對套接字庫的使用。同樣,本程序也需要鏈接庫文件: ws2_32.1ib。可以按照上面介
紹的添加庫文件的方
法,為UdpClient工程添加該庫文件的鏈接。最后,利用Build命令生成客戶端應用程序:
UdpC1ient.exe。這時,基于 UDP的服務器端和客戶端程序都己經生成了,同樣,服務器端程序
應先
啟動,否則無法完成通信。然后啟動客戶端程序。這時,客戶端程序和服務器端程序的界面如圖
14.12所示。
550 I ~脅'
詳解
罔 14.12基于 UDP的網絡應用程序運行結果
可以看到,這時客戶端己經終止了,服務器端收到一條信息: Hello。這里,服務器端作為接收
端,客戶端作為發送端。
通過以上的程序代碼,可以看到,基于 UDP的網絡應用程序的編寫非常簡單,因為不需要建立連
接,所以對客戶端程序來說,當創建套接字之后,就可以直接利用 sendto函數發送數據了。應
注意的是,基于 TCP和基于 UDP的網絡應用程序在發送和接收數據時使用的函數是不一樣的:前
者使用 send和 recv,后者使用 sendto和 recvfrom o
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -