1.1.1 Visual C++(www.cppentry.com)网络编程(www.cppentry.com)概述(3)
4. 搭建开发环境
在Visual C++(www.cppentry.com) 6.0环境下进行Winsock的API编程(www.cppentry.com)开发,需要在项目中导入以下三个文件,否则会发生编译错误。
WINSOCK.h:WINSOCK API的头文件,需要包含在项目中。
WSOCK32.lib:WINSOCK API链接库文件,使用时一定要把它作为项目的非默认的链接库包含到项目文件中去。
WINSOCK.dll:WINSOCK的动态链接库,位于Windows的安装目录下。
5. 两个常用的数据结构
套接字是网络通信过程中端点的抽象表示,在实现中以句柄的形式创建,包含了进行网络通信所必需的5种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址和远程进程的协议端口。
WinSock编程(www.cppentry.com)中常用的数据结构有sockaddr_in和in_addr。
(1) sockaddr_in结构
WinSock通过sockaddr_in结构对有关Socket的信息进行了封装:
- struct sockaddr_in {
- short sin_family;
- unsigned short sin_port;
- IN_ADDR sin_addr;
- char sin_zero[8];
- };
上述结构中各个参数的具体说明如下。
sin_family:指网络中标识不同设备时使用的地址类型,对于IP地址,它的类型是AF_INET。
sin_port:指Socket对应的端口号。
sin_addr:是一个结构,将IP进行了封装。
sin_zero:一个用来填充结构的数组,字符全为0,这个结构对于不同地址类型可以是相同的大小。
(2) in_addr结构
in_addr结构对IP地址进行了封装,既可以用4个单字节数表示,也可以转换为两个双字节数表示或一个四字节数表示。这样定义是为了方便使用,例如在程序中初始化IP时,可以传入4个单字节整数,而在函数间传递这个值时,可以将其转换成一个四字节整数使用。in_addr结构定义如下:
- struct in_addr {
- union {
- struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b;
- struct { u_short s_w1, s_w2; } S_un_w;
- u_long S_addr;
- } S_un;
- };
6. Windows Sockets基础
在MFC类库中,几乎封装了Windows Sockets的全部功能。在接下来的内容中,将简单介绍两个最常用的套接字相关类--CAsyncSocket类和CSocket类。
(1) CAsyncSocket类
在微软基础类库中,CAsyncSocket类封装了异步套接字的基本功能。用户使用该类进行网络数据传输的步骤如下。
① 调用构造函数创建套接字对象。
② 如果创建服务器端套接字,则调用函数Bind()绑定本地IP和端口,然后调用函数Listen()监听客户端的请求。如果请求到来,则调用函数Accept()响应该请求。如果创建客户端套接字,则直接调用函数Connect()连接服务器即可。
③ 调用Send()等功能函数进行数据传输与处理。
④ 关闭或销毁套接字对象。
(2) CSocket类
CSocket类派生于CAsyncSocket类。该类不但具有CAsyncSocket类的基本功能,还具有序列化功能。用户在实际编程(www.cppentry.com)中,通过将CSocket类与CSocketFile类和CArchive类一起使用,能够很好地管理数据以及发送数据。用户使用该类进行网络编程(www.cppentry.com)的步骤如下。
① 创建CSocket类对象。
② 如果创建服务器端套接字,则调用函数Bind()绑定本地IP和端口,然后调用函数Listen()监听客户端的请求。如果请求到来,则调用函数Accept()响应该请求。如果创建客户端套接字,则直接调用函数Connect()连接服务器即可。
③ 创建与CSocket类对象相关联的CSocketFile类对象。
④ 创建与CSocketFile类相关联的CArchive对象。
⑤ 使用CArchive类对象在客户端和服务器之间进行数据传输。
⑥ 关闭或销毁CSocket类、CSocketFile类和CArchive类的3个对象。