⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14.6.2 客户端程序.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
14.6.2 客户端程序
下面编写基于UDP的聊天客户端程序,同样,向己有的NetSrv工作区中增加一个空的 Windows32 
Console Application类型的工程: NetClient。并为该工程添加一个C++源文件: NetClient.cpp。
接着,为该工程添加对WinSock库的链接,即在工程设置对话框的Link选项卡上添加ws2 32.lib
文件的链接。然后在NetClient叩p文件中添加聊天客户端程序的实现代码,结果如例 14-6所示。 
~JJ 14-6 

#include <W工nsock2 .h> #include <stdio .h> 
飞Toid main () 
//加载套接字库 
WORD wVersionRequested; 
WSADATA wsaData; 
int err; 

wVersionRequested = MAKEWORD( 1, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData ) ; i f ( err ! = 0 ) { 
554 
'如' 
return, 
if ( LOBYTE( wsaData.wVersion ) != 1 II 
H工 BYTE( wsaData.wVersion ) != 1 ) { 
WSACleanup( ), 
return, 

11创建套接字 
SOCKET sockClient=socket(AF_INET, SOCK_DGRAM, O) , 
SOCKADDR_IN addrSrv, addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1") , 
addrSrv.sin_family=AF_INET, addrSrv.sin-port=htons(6000) , 
char recvBuf[100] , 
char sendBuf[100] , 
char tempBuf[200] , 

int len=sizeof.(SOCKADDR) , 
while (1) 
11发送数据 
printf("Please input data:\n") , 
gets (sendBu f) , 
sendto(sockClient , sendBuf , strlen(sendBuf) +1 , 0 , 

(SOCKADDR*)&addrSrv, len); 
/1等待并接收数据 
recvfrom(sockClient , recvBuf , 100 , O, (SOCKADDR*)&addrSrv, &len) , 
if('q'==recvBuf[O]) 
{ sendto (sockClient , "q" , strlen ( "q" ) +1 , 0 , 
(SOCKADDR*)&addrSrv, len) , printf("Chat end!\n" ) , break, 
} 
sprintf (tempBuf , "毡 s say :革 s", inet_ntoa(addrSrv.sin_addr), recvBuf), 
printf("毡 s\n", tempBuf) , 

11关闭套接字 
closesocket(sockClient) , 
WSACleanup() , 

'~.‘ I 555 

在上述例 14-6所示代码中,首先加载套接字库,这可以复制上面程序中己有的代码。
然后,按照上面讲述的基于UDP(面向无连接)的socket编程的客户端程序的编写过程,第一步应
该调用socket函数创建套接字,其参数设置与上面NetSrv程序中的相同。
对基于 UDP的客户端程序来说,它不需要绑定,但它需要设定数据发送的目标方的地址信息,实
际上就是将数据发送到服务器端,于是定义-个地址变量: addrS凹,并将该变量中的字段设定为
服务器端的地址信息。因为在本例中,服务器端和客户端程序都是在本机上运行,所以IP地址还
是选用 127.0.0.1,然后利用iElet-addr函数将点分十进制格式的IP地址转换为u_long类型的数
值。
接下来,定义了三个字符数组,其中recvBuf用来保存接收的信息; sendBuf用来保存发送的信息; 
tempBuf用来存放中间临时数据。
因为在调用recvfrom函数接收数据时,该函数的最后一个参数将接收返回的地址结构的长度,但
是在调用之前这个参数变量必须经过初始化,因此,定义一个整型变量: len. 并将其初始化为
地址结构类型SOCKADDR的长度。
然后,程序进行一个while循环。在该循环中,作为数据发送端来说,首先要发送数据,并且要
发送的数据是用户通过键盘输入的。于是程序首先提示用户让其输入数据,然后调用gets函数获
取用户输入的数据。得到数据后,就可以调用sendto函数发送数据。
在发送完数据之后,接下来就等待服务器端的回应信息,于是调用recv企om函数。同样地,在接
收到数据之后,判断服务器端是否想要退出,即接收到的第一个字符是否是"q"字符,如果是,
表明服务器端想要退出,则也发送一个"q"字符,并且多发送一个字节,之后,打印信息: Chat 
end!,表明聊天终止,然后调用break语句终止while循环。如务器端发送来的数据第一个字符不
是字符 "q",则把服务器端困复的信息进行格式化,然后打印在标准输出设备,即屏幕上。格式
化的模式是:服务器端IP say服务器端回复的数据,其中服务器端E地址可以通过变量addrSrv的 
sin_addr字段获得,然后调用inecntoa函数将in_addr结构类型的数据转换为点分十进制格式表
示的E地址字符串。

当退出while循环后,需要调用closesocket函数关闭套接字,并调用WSACleanup函数终止套接字
库的使用。以上就是基于 UDP的简单网络聊天程序的客户端的实现。利用 Bui1d命令生成 
NetClient程序。
这时,.基于 UDP的简单网络聊夭程序的服务器端和客户端程序都已经生成了,可以看看效果。
首先启动服务器端,然后启动客户端,接着在客户端输入 "hel1o",并按回车键,然后就可以看
到服务器端收到了: "127.0.0.1 say: Hel1o"这条信息。这时,后者也可以输入 "hello",并按
回车键,客户端会立即收到服务器端的回应信息。服务器端和客户端可以继续按此方式聊天。当
某一端不想再继续聊天时,可以输入 "q"字符并回车,于是可以看到双方的聊天过程终止了。
这里我们实现了一个简单的基于~UDP的网络聊天程序,后面的章节还会介绍一个基
于图形界面的采用多线程技术实现的网络聊天程序。
556 I ~~... 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -