异步版本的使用为例进行说明。该函数原型如下:
HANDLE WSAAsyncGetHostByName(
HWND hWnd,
u_int wMsg,
const char FAR *name,
char FAR *buf,
int buflen
);
在调用WSAAsyncGetHostByName启动操作时,不仅指定主机名字name,还指定了一个窗口句柄hWnd,一个消息ID wMsg,一个缓冲区及其长度。如果不能立即得到主机地址,则返回一个错误信息表示还在等待。当要的数据到达时,WinSock DLL给窗口hWnd发送消息wMsg告知得到了主机地址,窗口过程从指定的缓冲区buf得到主机地址。
使用异步函数或者非阻塞的socket,主要是为了不阻塞本线程的执行。在多进程或者多线程的情况下,可以使用两个线程通过同步手段来完成异步函数或者非阻塞函数的功能。
Socket的使用
WinSock以DLL的形式提供,在调用任何WinSock API之前,必须调用函数WSAStartup进行初始化,最后,调用函数WSACleanUp作清理工作。
MFC使用函数AfxSocketInit包装了函数WSAStartup,在WinSock应用程序的初始化函数IninInstance中调用AfxSocketInit进行初始化。
程序不必调用WSACleanUp。
Socket是网络通信过程中端点的抽象表示。Socket在实现中以句柄的形式被创建,包含了进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
要使用socket,首先必须创建一个socket;然后,按要求配置socket;接着,按要求通过socket接收和发送数据;最后,
程序关闭此socket。
为了创建socket,使用socket函数得到一个socket句柄:
socket_handle = socket(protocol_family. Socket_type, protocol);
其中:protocol_family指定socket使用的协议,取值PF_INET,表示Internet(TCP/IP)协议族;Socket_type指socket面向连接或者使用数据报;第三个参数表示使用TCP或者UDP协议。
当一个socket被创建时,WinSock将为一个内部结构分配内存,在此结构中保存此socket的信息,到此,socket连接使用的协议已经确定。
创建了socket之后,配置socket。
对于面向连接的客户,WinSock自动保存本地IP地址和选择协议端口,但是必须使用connect函数配置远地IP地址和远地协议端口:
result = connect(socket_handle, remote_socket_address, address_length)
remote_socket_address是一个指向特定socket结构的指针,该地址结构为socket保存了地址族、协议端口、网络主机地址。
面向连接的服务器则使用bind指定本地信息,使用listen和accept获取远地信息。
使用数据报的客户或者服务器使用bind给socket指定本地信息,在发送或者接收数据时指定远地信息。
bind给socket指定一个本地IP地址和协议端口,如下:
result = bind( socket_hndle, local_socket_address, address_length)
参数类型同connect。
函数listen监听bind指定的端口,如果有远地客户请求连接,使用accept接收请求,创建一个新的socket,并保存信息。
socket_new = accept(socket_listen, socket_address, address_length)
在socket配置好之后,使用socket发送或者接收数据。
面向连接的socket使用send发送数据,recv接收数据;
使用数据报的socket使用sendto发送数据,recvfrom接收数据。
MFC对WinSockt API的封装
MFC提供了两个类CAsyncSocket和CSocket来封装WinSock API,这给
程序员提供了一个更简单的网络编程接口。
CAsyncSocket在较低层次上封装了WinSock API,缺省情况下,使用该类创建的socket是非阻塞的socket,所有操作都会立即返回,如果没有得到结果,返回WSAEWOULDBLOCK,表示是一个阻塞操作。
CSocket建立在CAsyncSocket的基础上,是CAsyncSocket的派生类。也就是缺省情况下使用该类创建的socket是非阻塞的socket,但是CSocket的网络I/O是阻塞的,它在完成任务之后才返回。CSocket的阻塞不