网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
源代码在线查看: 14.5.2 客户端程序.txt
14.5.2 客户端程序
现在编写基于 UDP的网络客户端应用程序,与上面基于 TCP的网络应用程序一样,这里也在同一
个 UdpSrv工作区中创建客户端应用程序。同样,创建一个空的 Win32 ConsoleWin32 Console
Application类型的工程,名称为: UdpClient。然后为该工程添加一个 C++源文件:
UdpClient.cpp,然后在此文件中添加实现基于 UDP的网络客户端程序的代码,结果如例 14-4
所示。
例 14-4
#include
#include
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