当使用TCP/IP协议一发客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便以他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。 bind()函数实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。
对客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求,接下来就可以与服务器通信了。
开发套接字应用程序时,首先应进行Windows Sockets的初始化,加载Windows Sockets的实现,然后创建套接字,对TCP套接字来说,需要在socket()函数或都WSASocket()函数中指明SOCK_STREAM套接字类型。当服务器和客户端通信结束时,关闭套接字,释放Windows Sockets的实现。
流程如下:
服务器:创建套接字―>绑定―>监听―>接受连接―>收发数据―>关闭
客户端:创建套接字―>连接―>收发数据―>关闭
Windows Sockets API重要函数说明如下:
一、WSAStartup()函数:
不管是客户端还是服务器,开发Windows Sockets应用程序时,必须首先加载Windows Sockets动态库(DLL)。WSAStartup()函数实现此项功能。该函数是套接字 应用程序必须调用的第一个函数。
该函数声明如下:
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
wVersionRequested:指定准备加载Windows Sockets动态库的版本。高字节指定所需要库文件的副版本,低字节指定主版本。在应用程序中可以使用MAKEWORD(X,Y)方便指定该参数。X是高位字节,Y是低位字节
lpWSAData:指向lpwsadata结构的指针,该参数返回被加载动态库的有关信息。
WSADATA结构声明如下:
#define WSADESCRIPTION_LEN 256
#define WSASYS_STATUS_LEN 128
struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char *lpVendorInfo;};
WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息。
wVersion :Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号, 低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)
wHighVersion :这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。
szDescription :以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。
szSystemStatus :以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。
iMaxSockets :单个进出能够打开的socket的最大数目。
iMaxUdpDg:一个进程发送或接收的最大数据报长度
lpVendorInfo :指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。