相关函数说明:
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
作用:加载套接字库,协商套接字版本
函数说明:
wVersionRequested:用于指定准备加载的winsock库的版本,高位字节指定所需要的库的副版本,而低位则是主版本。可用MAKEWORD(x,y)(x是高位,y低位)获得正确值
lpWSAData是指向WSADATA结构的指针,WSAStartup用其加载的库版本有关的信息填在这个结构中
typedef struct WSAData {
WORD wVersion;//打算使用的winsock版本
WORD wHighVersion;//现有的winsock库的最高版本
char szDescription[WSADESCRIPTION_LEN+1];//由特定的winsock实施方案设定,没有使用
char szSystemStatus[WSASYS_STATUS_LEN+1];// //由特定的winsock实施方案设定,没有使用
unsigned short iMaxSockets;//不用
unsigned short iMaxUdpDg;//不用
char FAR* lpVendorInfo;//厂商信息,可不使用
} WSADATA,
*LPWSADATA;
对于每一个WSAStartup的成功调用,在最后都对应一个WSACleanUp调用,以便释放为该应用程序分配的资源,并卸载WinSockDLL
Winsock相关函数说明:
SOCKET socket(
int af,//地址族,只能为AF_INET
int type,//socket类型
int protocol//指定为0,自动选择一个合适的协议
);
int bind(
SOCKET s,
const struct sockaddr* name,//本地地址信息,长度由第三个参数确定,因为它是为所有的地址家庭准备的,该结构可能随所使用的网络协议不同而不同
int namelen
);
在TCP/IP中可用下面的结构体替换sockaddr,注意除了成员sin_family外,均以网络字节序表示
struct sockaddr_in {
short sin_family;//地址族
u_short sin_port;//端口
struct in_addr sin_addr;//主机IP地址
char sin_zero[8];//只是一个填充数,以使sockaddr_in结构和sockaddr结构的长度一样
};
typedef 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;
} in_addr;
Inet_addr()函_数会返回一个适合分配给S_addr的ulong类型的数值,inet_ntoa会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串
SOCKET accept(
SOCKET s,
struct sockaddr* addr,//out,保存连接到服务器的客户机的IP地址等信息
int* addrlen//out,msdn有错误,此参数在传递时必须赋一个初始值,但MSDN并没有说明这一点
);