Windows网络编程
一、Winsock初始化
每个Winsock程序都必须加载合适的Winsock DLL版本,现有winsock1,winsock2。在调用Winsock之前首先的工作就是加载winsock相应的库。
加载所用的API是WSAStartup
当应用程序结束之后,关闭的API是WSACleanup
WSAStartup需要一个版本号信息及一个WSADATA的结构体作为函数的返回值。它的原型是这样的:
LPWSADATA lpWSAData);
下面, 看一下WSAData结构体究竟描述了些什么信息:
typedef struct WSAData
{
WORD wVersion; //版本号
WORD wHighVersion; //现有Winsock的最高版本
char szDescription[..]; //没有实际作用
char szSystemStatus[..]; //没有实际作用
unsigned short iMaxSocket; //可同时打开的最大套接字数量
unsigned short iMaxUdpDg; //数据报最大长度
char FAR* lpVendorInfo; //保留字段
}WSADATA* LPWSADATA
{
WORD wVersion; //版本号
WORD wHighVersion; //现有Winsock的最高版本
char szDescription[..]; //没有实际作用
char szSystemStatus[..]; //没有实际作用
unsigned short iMaxSocket; //可同时打开的最大套接字数量
unsigned short iMaxUdpDg; //数据报最大长度
char FAR* lpVendorInfo; //保留字段
}WSADATA* LPWSADATA
具体的代码:
int main()
{
WSADATA wsaData;
int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
if(Ret != 0)
{
cout<<"无法初始化winsock."<<endl;
}
else
cout<<"初始化winsock成功"<<endl;
//..
if(WSACleanup()==SOCKET_ERROR)
{
cout<<"WSAData无法cleanup.";
}
return 0;
}
二、IPv4结构体
当计算机通过TCP、UDP进行通迅时,用得最多的可能就是其主机的IP地址,应用程序的端口号。如何来表示这些信息呢?在Winsock中,可以通过一个结构体来指定其IP和服务端口的信息。结构体如下:
{
short sin_family; //必须指定AF_INET
u_short sin_port; //端口号
struct in_addr sin_addr; //IP的地址表示
char sin_zero[8]; //填充字段,用来兼容SOCKADDR结构体
};
还有一些其它的函数,可以很方便的进行IP地址至字符串形式,32位整行形式 in_addr结构体形式的转换。还有的,可以把本地字节顺序与网络字节顺序进行转换
1.把一个点分IP转换成一个32位无符号长整型:
unsigned long inet_addr(const char FAR* cp);
2.将主机字节顺序转换为网络字节顺序
u_long htonl(u_long hostlong);
int WSAHtonl(SOCKET s, u_long hostlong, u_long FAR* lpnetlong);
u_short htons(u_short hostshort);
int WSAHtons(SOCKET s,u_short hostshort, u_short FAR* lpnetshort);
以上有不同的只是有些字节需要转换为long型,比如IP地址,有些只需要short型就可以了,比如PORT号.
而与上面逆向的函数则有:
u_long ntohl(u_long netlong);
int WSANtohl(SOCKET s, u_long netlong, u_long FAR* lphostlong);
//关于short型的,这里略