?? 14.5 基于 udp的網(wǎng)絡(luò)應(yīng)用程序的編寫及服務(wù)器端程序.txt
字號:
14.5 基于 UDP的網(wǎng)絡(luò)應(yīng)用程序的編寫
14.5.1 服務(wù)器端程序
如果在讀者的 VC++開發(fā)環(huán)境中,先前的工作區(qū)還是打開的,首先就關(guān)閉該工作區(qū),然后利用
【 New\Files...】菜單命令新建一個工程。同樣,選擇 Win32 Console Application 類型,工
程名稱為 : UdpSrv。并在應(yīng)用程序創(chuàng)建向?qū)У牡?1步選擇 : An ennpty project選項,以創(chuàng)
建一個空的工程。接著利用【文件\新建】菜單命令添加一個 C++源文件: UdpSrv.cpp, 然后在此
文件中添加實現(xiàn)基于 UDP的服務(wù)器端程序的代碼,結(jié)果如例 14-3所示。
例 14-3
#include <winsock2 .h> #工 nclude <stdio .h>
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;
}
//創(chuàng)建套接字
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一工 NET;
addrSrv. sin-po r t=htons(6000);
//綁定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
//等待并接收數(shù)據(jù)
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100l;
recvfrom(sockSrv,recvBuf ,100 , 0, (SOCKADDR*)&addrClient , &len);
printf("%s\n" , recvBuf) ;
//關(guān)閉套接字
closesocket(sockSrv);
WSACleanup() ;
同樣,因為在利用套接字編寫網(wǎng)絡(luò)應(yīng)用程序時,都需要套接字庫,所以這部分代碼可以重用。因
此可以直接復(fù)制上面程序中已有的這部分代碼。然后按照上面介紹的基于 UDP(面向無連接)的
socket編程的服務(wù)器端程序流程完成該程序。
面創(chuàng)建套接宇 (sockeO。
與上面基于 TCP的服務(wù)器端程序一樣,這里也需要調(diào)用 socket函數(shù)創(chuàng)建一個套接字,第一個參
數(shù)只能是 AF INET (或 PF_INET).因為現(xiàn)在是基于 UDP的網(wǎng)絡(luò)應(yīng)用程序,應(yīng)該創(chuàng)建數(shù)據(jù)報套接字,
因此第二個參數(shù)應(yīng)指定為 SOCK_DGRAM .第三個參數(shù)設(shè)為 0。
③將套接字綁定到一個本地地址和端口上 (bind)。首先定義了一個 SOCKADDR_IN類型的變量:
addrS凹,然后對其數(shù)據(jù)成員進(jìn)行賦值。
接下來調(diào)用 bind函數(shù),將套接宇與本地的一個 E地址與端口相綁定。CIl等待接收數(shù)據(jù)
(recvfrom)。對于基于 UDP的服務(wù)器端來說,就是一個接收端,所以接下來調(diào)用 recvfrom函數(shù)
接
收數(shù)據(jù)。注意,在編寫基于 UDP的網(wǎng)絡(luò)程序時,在接收數(shù)據(jù)時,使用的是 recvfrom函數(shù)。而前
面基于 TCP的服務(wù)器端程序接收數(shù)據(jù)時使用的是 recv函數(shù)。
548 I .........
為了接收數(shù)據(jù),首先定義了一個地址結(jié)構(gòu)的變量: addrClient,用來接收發(fā)送方的地址信息。然
后定義-個整型變量: len,并將地址結(jié)構(gòu)的長度作為初值賦給該變量。接下來定義-個有 100個
元素的字符數(shù)組: recvBuf,用來接收數(shù)據(jù)。之后,就可以調(diào)用 revefrom函數(shù)接收數(shù)據(jù)了。
在接收到數(shù)據(jù)之后,利用 printf函數(shù)將其打印輸出。
由關(guān)閉套接字。
在通信完成之后,調(diào)用 closesocket函數(shù)關(guān)閉套接字,釋放為該套接字分配的資源。最后調(diào)用
WSACleanup函數(shù),終止對套接字庫的使用。
完成程序代碼之后,還需要在工程設(shè)置對話框的鏈接選項卡下添加庫文件: Ws2_32.lib 的鏈接。
然后利用 Build生成 UdpSrv程序。可以看到,基于 UDP的服務(wù)器端程序的編寫比較簡單,在綁
定套接字之后就可以接
收數(shù)據(jù)了,不需要建立監(jiān)聽,或者說建立連接。
.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -