第 24卷 第 6期
北京工商大学学报(自然科学版)
Vol. 24 No. 6
40 2006年 11月
Journal of Beijing Technology and Business University (Natural Science Edition)
Nov. 2006
文章编号 :1671-1513(2006)06-0040-05
VC++环境下基于 WinSock的网络通信
马永宏, 刘载文, 贾永振
(北京工商大学 信息工程学院 ,北京 100037)
摘 要:首先说明了网络编程界面Socket(套接字)的基本原理及 Microsoft Windows网络程序设
计 接 口 Windows Sockets的构成.然后介 绍 了在VC++6. 0环境 下,基 于 TCP/IP协议 ,利 用
Winsock实现客户/服务器模式网络编程的流程和方法.
1
TCP/IP协议、应用程序与套接字
关键词 :套接字;TCP/IP;客户/服务器模式
中图分类号:TP311
文献标识码:A
随着Internet的迅猛发展,网络通信应用程序
的开发成为研究热点.Windows环境下进行通讯程
序设计的最基本方法是应用Windows Sockets实现
进程间通讯[[11
TCP/IP协议是众多网络协议中比较完善的一
种,它的核心部分是传输层协议(TCP, UDP )、网络
协议层(UP)和物理接口层.这三层通常在操作系统
内核中实现.操作系统的内核是不能为用户所感受
到的,一般用户感受到的只有应用程序.应用程序通
过程序界面与操作系统内核打交道.TCP/IP网络
环境下的应用程序是通过网络系统编程界面套接字
Socket(在 Windows操作系统下称之为 Winsock )
来实现的.Socket构成了核心协议的用户视图.通
过 Socket,应用程序可访问通信协议.TPC/IP协议
核心与应用程序之间的关系如图1.
套接字(Socket)是网络通信的基本构件[[2].套
接字是可以被命名的通信端点,应用程序通过它在
网络上发送和接收数据.每个套接字都有其类型,并
有一个与之相连的进程.TCP/IP提供 3种类型套
接字[[3]:
1)流式套接字(SOCK-STREAM).该接 口提
供一个面向连接、可靠的数据传输服务,数据无差
错、无重复地发送 ,且按发送顺序接收.内设流量控
制,避免数据流超限;数据被看作字节流,无长度限
制.流式套接字提供了一种可靠的面向连接的数据
传输方式,如果想发送大批量数据或想让数据按顺
序无重复地到达目的地,流式套接字最为有用.本文
使用流式套接字.
应用程序 I
应用程序 n
网络程序设计,如Windows Socket
网络通信协议,如TCP/IP
操作系统,如Windows
物理通讯介质
图 1 应用程序与 Windows Sockets的关系
2)数据包套接字(SOCK_DGRAM).该接 口提
供一个无连接服务.数据包以独立包形式被发送,不
提供无错保证,数据可能丢失或重复,并且接收顺序
混乱。数据包套接字比较适用于数据包或记录型数
据的传输,数据包的发送不能得到保证,而且不能排
序到达.
3)原始式套接字((SOCK-RAW).该接 口允许
对较低层协议,如 IP,ICMP直接访问.
套接字至少在客户机/服务器模式;点对点模
式;远程程序调用(RPC)三种通信环境下广泛应用.
收稿 日期:2006-04-06
基金项目:北京市高校拔尖创新人才计划项目((200589).
作者简介 :马永宏(1976-),男,山西长治人,硕士研究生,主要从事工业 自动化与计算机监测网络等方面的研究.
第 24卷 第 6期
马永宏等 :VC++环境下基于 WinSock的网络通信
2 Windows Sockets介绍
Sockets最初只是 UNIX系统中最流行的网络
通信接口之一[‘〕.1992年制定出Windows Sockets
规范 1.0版.目前实际应用中的 Windows Sockets
规范主要有 1.1版和 2.0版,其 中 1.1版只支持
TCP/IP协议,而 2.0版支持多协议,并具有良好的
向后兼容性.Windows Sockets是 Microsoft
Windows的网络程序设计接 口,使在 Windows下
开发高性能的网络程序成为可能.
Windows Sockets实现一般由两部分组成:开
发组件和运行组件.开发组件包括介绍 Windows
Sockets实现的文档、Windows Sockets应用程序接
口(API)引入库 和一些头 文件.运行 组 件是
Windows Sockets应用程序接 口的动态链接库
(DLL),文件名为 WINSOCK. DLL,应用程序在执
行时通过装入它实现网络通信功能.
Windows Sockets是 Berkelery Sockets在
Windows环境下的扩充[51,它为 Windows下网络
异步通信提供了一种方便的开发和运行环境,现在
已经成为 Windows标准下的网络程序设计接 口,
Windows下各种开发平台都支持 Windows Sockets
上的网络程序设计,提供了网络编程接口.
Windows Sockets API是 Windows Sockets的
网络程序接 口,它包括一个 标准 的 Berkelery
Sockets功能调用集合,以及为 Windows所作的扩
充功能.扩充功能的调用都冠以 WSA (windows
sockets asnchronous)前缀,表明它们都允许异步的
I/O操作,并采用符合 Windows消息机制的网络事
件异步选择机制.这些扩充功能有利于开发者更好
地利用 Windows的消息驱动特性来设计出高性能
的网络程序.
3 网络通信的实现
下面结合本人课题中的数据集中管理系统部
分,通过一个客户机/服务器模式的网络应用程序,
实现对 CSocket类的派生和应用为例介绍网络通信
的实现.
3.1 客户机/服务器模式
数据集中管理需要融合各控制系统的不同数
据,由于各控制系统连接在不同的网络上,要融合其
中的实时信息需要解决异种网联的问题,而 TCP/
IP协议无疑是一个很好的选择.
对于各集中监测系统,与数据集中管理系统同
在中央调度室,因此可以在遵循 TCP/IP协议的局
域网中进行实时通信.在 TCP/IP协议下利用
Socket进行网络编程,自然就会涉及到C/S(客户机
/服务器)模式,即客户端向服务器发出请求,服务器
接收到请求后提供相应的服务.客户机/服务器模式
在操作过程中采取的是主动请求方式.
3.1.1 服务器方
首先服务器方要启动,侦听客户方是否有连接
请求,并根据请求提供相应服务:
1)打开一通信通道并告知本地主机,它愿意在
某一公认地址端口上接受客户请求,或者由开发人
员自己指定端口地址;
2)等待客户请求到达该端口;
3)接收到重复服务请求时,处理该请求并发送
应答信号.接收并发送服务请求,需要激活一个新进
程来处理这个客户请求,并不需要对其他请求作出
应答.服务完成后,关闭此新进程与客户的通信链
路,并终止;
4)返回第二步,等待另外的客户请求;
5)关闭服务器.
3.1.2 客户方
1)打开一通信通道 ,并连接到服务器所在的主
机的特定端口;
2)向服务器发出服务请求报文,等待并接收应
答,继续提出请求;
3)请求结束后关闭通信通道并终止.
从以上描述过程可以看出:客户机与服务器进
程的作用是非对称的,因此编码不同,而且服务进程
要先于客户请求启动.基于面向连接的Socket的客
户机/服务器应用程序基本结构如图2.
3.2 用W insock进行网络编程
为了简化 WinSock网络编程,使用户专注于应
用 程 序 算 法 的 设 计,Microsoft的 基 本 类 库
(microsoft foundation class或 MFC)提供了两种利
用Windows Sockets进行网络通信的编程模式,这
两 种 模 式 即 为 用 CAsyncSocket类 和 派 生 于
CAsyncSocket的CSocket类[s]来编程.这两个类在
不同程度上对 WinSock API的函数进行了封装,在
编程时使用经过封装的 MFC WinSock类使编程工
作大大简化,而且,这两个类都提供了事件处理函
数,通过对事件处理函数进行重载,用户可以在应用
北京工商大学学报(自然科学版)
2006年 11月
程序中很方便地对套接字发送、接收数据等事件进
行处理.
CAsyncSocket类 封 装 了 Windows Sockets
API函数,提供了较低层的与 Windows Sockets对
话接 口,一般适合于有相当水平的网络编程基础者
使用,可方便地进行底层的网络事件通知及信息回
叫控制等操作.
服务器方
}初始化本地端口,用Socket创建本地端口
绑定本地端口,用 BindO指定本地地址
倾听此端口,Listen()监听连接
接受请求,用Accept()接受请求
初始化本地端口用 Socket创建本地端口 1
客户方
阻塞、等待客户请求
连接服务器端口,用ConnectQ建立连接
在此连接端口接受传输数据,用Receive()
发送请求数据,用Sendo发送
发送响应数据,用 Send()
在此连接端接受传输数据,用Receive()
断开连接,用Close()关闭端口
断开连接,用 Close()关闭端口
结束服务
图 2 面向连接的套接字应用程序的时序
CSocket派生于 CAsyncSocket,它继承了父类 Socket
在类 ClisteningSocket中创建监听端口,一旦
中一些常用易懂的Windows Sockets API函数,并
对CAsyncSocket中底层的较难控制的一些 APT函 有数据到达它将通知Socket,实现如下:
数或成员函数进行了处理,同时它支持模块化的后
台信息处理,解决了 CAsyncSocket中较难克服的
多线程处理.正是基于Csocket类的这些优点,程序
中采用Csocket类来实现数据的传输.
3.2.1 程序设计思怒
void CSocketServer::OnSocketSet()
{//创建监听套节字
m_pSocket=new CListeningSocket (this) ;
if (m_ pSocket一>Create (nPort -I- 700)) m-
pSocket- >Listen O ;
}
客户端也建立一个类 CSocketClient用于与服
虽然 MFC本身提供了 CSocket类用于实现客
户机与服务器之间的通信,但是为了增强程序的可
扩 展 性 和 提 高 性 能,在 服 务 器 端 建 立 了 务器端通信,也继承自CSocket类.
ClisteningSocket类用于监听协议端 口,通过对
CSocket类的 listen )函数重载使得当客户端提出
连接请求时,可以做出应答,同时建立了客户端类
CClientSocket,它继承 自 CSocket类,通过重载
Accept)函数与客户端建立连接,用于处理服务器
端数据的发送和接收.
void CSocketClient : :OnSetup ( )
{//创建一个新的Socket
m_pSocket=new CSocketClient (this);
if (! m_pSocket->Create())
{delete m_ pSocket; m_ pSocket=NULL;
return;)
在客户端也建立了CSocketClient类用于处理
//连接服务器
客户端数据的发送和接收.
3.2.2 程序实现
服务器端Socket程序是在CSocketServer类中
实现的,数据的接收和处理都是在这个类中实现的.
主要步骤如下:
}
2)客户端与服务器端的连接
当listeno函数监听到有客户端程序建立连接
时,服务器端就新建一个 CClientSocket用于与客户
1)服务器端创建监听Socket以及客户端创建 端进行数据交换传输,并把它链到链表的尾部,需要
第 24卷 第 6期
马永宏等 :VC++环境下基于 WinSock的网络通信
进行数据传输时通过链表进行连接,这样就可以实
现一个服务器与多个客户端的连接,然后通过重载
CSocket类的OnAccept)函数进行处理.服务器端
程序如下 :
void
CListeningSocket :: OnAccept (int
nErrorCode )
{CSocket::OnAccept (nErrorCode );//主对话
{char buffer[BUFFER一SIZE];
int nReceived=pSocket一> Receive (buffer,
BUFFER_SIZE , 0);
buffer [nReceived]=0;
if (DoProcessData (buffer,nReceived ))
{ SendACK ( ) ; return TRUE;) //向客户端发
送接收正确信息
框处理连接信』e
else
pSocketServer一>ProcessPendingAccept();
}
其中函数 ProcessPendingAccept()代码如下:
void CSocketServer:;ProcessPendingAccept()
{//生成一个新的套节字与客户端通讯
CClientSocket * pSocket=new CClientSocket
();
{SendNCK O ;return
//向客户端发送接收不正确,要求重新发送的
;return FALSE;}
信息
}
其中函数 DoProcessData为数据处理函数,对
接收到的数据进行校验、解析后生成新的实时数据
库类对象,存入动态数组中.
if (m一pSocket一>Accept *pSocket))
m_connectionList. AddTail(pSocket);//将该
4)结束处理
把所有不用的 Socket删除 ,释放资源.
套节字保存起来
else delete pSocket;
4 结束语
}
当客户端需要与服务器通信时,客户端指定端
口和服务器名,创建一个 CSocketClient,如果连接
成功,那么就用这个 CSocketClient与服务器端进行
通信,如果连接不成功,则删除这个建立的Socket,
以节省资源.客户端程序还是在函数OnSetup ( )中
实现,如下:
void CSocketClient::OnSetup()
{//创建一个新的Socket
网络的优点使其应用逐渐广泛,利用网络互传
信息进行技术开发 的项 目越来越多.Windows
Sockets是 Windows下 的标准 程序设 计接 口.
VC++环境下,利用MFC的CSocket类,派生出所
需要的套接字,利用套接字建立连接、传输数据,对
套接字事件进行处理,是一种简洁高效的网络编程
方法.
参考文献
//连接服务器
while(!m一pSocket一>Connect (strServer,
[1] 刘亚军,李丽,蒋洪睿.对 MFC封装 Windows通讯
API的研究〔J].微电脑世界周刊,2005,(29):74 -
nPort+700))
{delete m一pSocket;m一pSocket= NULL;
return;}
}
3)客户端与服务器端数据的处理
当需要进行数据接收时,是通过重载 CSocket
类的函数 OnReceive ()来实现的,用于显示给用户
或是引发其它的动作.服务器端程序如下:
void CSocketServer ::ProcessPendingRead
(CClientSocket * pSocket)
77.
厂
L
勺
白
门
J
F
L
nj
勺
J
4
F
L
les
.‘
F
L
1匀
刁
J
月匕
L--
月
l
|
习
蒋东兴.Windows Sockets网络程序设计大全[M ].
北京:清华大学出版社,1999.
王红霞 ,姚家亮.网络环境下基于 Winsock的进程通
信方法[J].计算机时代,2001,(10):26一27.
Joe C. BobWillseylTCP/IP24学时教程[M].北京:
机械工业出版社,1999.
黄庆生,汤毅.精通 Visual C++6. 0[M].北京:人民
邮电出版社,2005.
Michael J Young. VisualC + + 6. 0从入门到精通
仁M].北京 :电子工业出版社,2004.
44
北京工商大学学报(自然科学版)
2006年 11月
NETW ORK COM M UNICATION BASED ON W INSOCK IN VC+ +
(College of Information Engineering, Beijing
MA Yong-hong,
LIU Zai-wen, JIA Yong-zhen
Technology and Business University,Beijing 100037,China)
Abstract:The article describes the basic theory of network's programming interface and the
organization of Windows Sockets which is Microsoft Windows network's programming interface.
It also discusses the progress and method of Client/Server model network's programming using
Winsock based on TCP/IP protocol on the condition of VC++6.0.
Key words:Socket;TCP/IP;Client/Server model
(责任编辑 :王 宽)
(土接第 39页)
RESEARCH OF AN ALGORITHM TO IM PROVE
ASSOCIATION RULES M INING EFFICENCY
JIN Wei', ZHANG Ke-jun', YANG Bing-ru'
(1. Education Technology Center, University of Beihua, Jilin 132000,China;
2. Dept. of Computer Science and Technology,Beijing Electronic Science and
Technology Institute,Beijing 100070,China;3. Information Engineering School,
University of Science and Technology Beijing,Bezl:ng 100083,China)
Abstract:After
analyzing the classical algorithms of association rules,it proposes the ARMLL
list. Through the comparison operation of the
in database and link listoperation,The ARM LL
multi-dimension link
recording frequent sets
algorithm based
transaction ID sets
on
algorithm can obviously improve the association rules
show that the algorithms are valid and fast.
m in in g efficiency. Theexperimentresults
Key words:datamining;associationrules;multi-dimension link list
(责任编辑 :邓清燕)