Windows网络编程(基础篇1)
- Winsock是一种网络编程接口,不是协议。
- 除了WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError属于Winsocket1.1规范函数外,凡是有前缀WSA的,都是在Winsock 2 中更新或者增添的一个新的API函数。
一、Winsock初始化
包含头文件winsock2.h,链接库WS2_32
include <winsock2.h> #pragma comment(lib,"WS2_32")
使用Winsock的应用都必须加载合适的Winsock DLL版本,否则返回SOCKET_ERROR。使用WSAStartup加载,最后需要调用WSACleanup释放Winsock分配的资源。
int WSAStartup( _In_ WORD wVersionRequested, _Out_ LPWSADATA lpWSAData );
- wVersionRequested:版本号,高阶字节指定小版本号,低位字节指定主版本。
- lpWSAData 指向WSADATA数据结构的,接收Windows Sockets实现细节。
WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData);//成功返回0
MAKEWORD:创建一个无符号16位整形,通过连接两个给定的无符号参数,也就是将(2,2)放入wVersionRequested中。
WSAGetLastError();//返回调用winsock函数发生的错误代码 WSACleanup();//程序结束时,需要调用释放资源
二、SOCKADDR_IN简介
SOCKADDR_IN:用来指定IP地址和端口信息。
typedef struct sockaddr_in { short sin_family; //The address family for the transport address,must AF_INET USHORT sin_port; //port number IN_ADDR sin_addr; // IPv4 transport address CHAR sin_zero[8]; //Reserved(预留) for system use } SOCKADDR_IN, *PSOCKADDR_IN;
inet_pton 转换字符串到网络地址。将“点分十进制” -> “二进制整数”(inet_addr已弃用)
//m_HostGroup.sin_addr.s_addr = inet_addr(strGroupIP);//代替方法如下:
inet_pton(AF_INET, strGroupIP, (void*)&m_HostGroup.sin_addr.s_addr);
INT WSAAPI InetPton( _In_ INT Family, // AF_INET and AF_INET6. _In_ PCTSTR pszAddrString, //待转换的地址,IPV4 或 IPV6 _Out_ PVOID pAddrBuf //转换后的(IPV4:IN_ADDR,IPV6: IN6_ADDR );
htons 将整型变量从主机字节顺序转变成网络字节顺序