12、套接字编程。
在使用套接字进行编程之前,无论是服务器还是客户端都必须加载Windows SOCKET动态库。
函数WSAStartup就实现了此功能。它是套接字应用程序必须调用的第一个函数。
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpwsadata);
---第一个参数指定准备加载的Windows SOCKET动态库的版本。一般使用宏MAKEWORD构造。
如MAKEWORD(2,2)表示加载2.2版本。
---WSADATA会返回被加载动态链接库的基本信息。如是否加载成功,以及当前实际使用的版本。
13、初始化socket后,需要创建套接字。socket函数和WSASocket函数可以实现此功能。
SOCKET socket(
int af,
int type,
int protocol);
---af表示使用协议的地址家族。创建TCP或UDP的套接字是使用AF_INET。
---type表示套接字的类型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM三种类型。分别表示流、数据包、原始套接字。
---protocol指示使用的协议。对于SOCK_STREAM套接字类型,该字段可以为IPPROTO_TCP或0。对于SOCK_DGRAM套接字类型,该字段为IPPROTO_UDP或0。
当函数创建成功时,返回一个新建的套接字句柄(即描述符)。否则将返回INVALID_SOCKET。此时需要调用WSAGetLastError( )检索对应的错误值,提示用户失败的原因。
14、bind函数。创建套接字之后需要调用bind将其绑定到一个已知的地址上。
int bind(
SOCKET s,
const struct sockaddr *addr,
int namlen);
---s为要绑定的套接字句柄,addr指向socket地址结构的指针。即要绑定的地址。
---namelen为sockaddr的长度。
注意:指向bind( )函数原型的指针引用总是通用地址结构socksddr。
函数调用成功将返回0,否则返回值为SOCKET_ERROR。
如果程序不关心分配给它的地址,可使用INADDR_ANY或将端口号设为0。端口号为0时,Windows SOCKET将给应用程序分配一个值在1024-5000之间唯一的端口号。