一:启动(关闭)套接字
1、包含头文件
1 #include <WinSock2.h>
2、引入库文件
1 #pragma comment(lib,"ws2_32.lib")
3、打开网络库
int WSAStartup( WORD wVersionRequired, LPWSADATA lpWSAData );
参数
返回值
错误代码 | 值 | 含义 |
WSASYSNOTREADY | 10091 | 底层网络子系统尚未准备好进行网络通信。 |
WSAVERNOTSUPPORTED | 10092 | 不支持给定的版本号,检查是不是将主版本号设置为0。 |
WSAEINPROGRESS | 10036 | 当一个阻塞函数正在进行时,调用任何Windows Sockets API函数均返回此错误。 |
WSAEPROCLIM | 10067 | Windows Sockets实现可能限制同时使用它的应用程序的数量,如果达到此限制,则返回该错误。 |
WSAEFAULT | 10014 | lpWSAData指针错误,检查是否传入nullptr。 |
版本号
//MAKEWORD(lowbyte, highbyte) WORD wdVersion = MAKEWORD(2, 1); //构造2.1版本
WSAData结构体
1 struct WSAData { 2 WORD wVersion; //当前使用的版本。 3 WORD wHighVersion; //当前支持的最高版本。 4 unsigned short iMaxSockets; //[2版本弃用]返回当前可用的Socket数量 5 unsigned short iMaxUdpDg; //[2版本弃用]UDP数据报信息大小 6 char *lpVendorInfo; //[2版本弃用]供应商特定信息 7 char szDescription[WSADESCRIPTION_LEN + 1]; //以NULL结尾的ASCII字符串,描述Win Socket套接字实现说明。 8 char szSystemStatus[WSASYS_STATUS_LEN + 1]; //以NULL结尾的ASCII字符串,描述相关状态或配置信息。 9 };
4、关闭网络库
1 int WSACleanup();
返回值
错误代码 | 值 | 含义 |
WSANOTINITIALISED | 10093 | 在使用该函数之前,必须成功调用WSAStartup |
WSAENETDOWN | 10050 | 套接字操作遇到一个不活动的网络。此错误可能指示网络系统(例如WinSock DLL运行的协议栈)、网络接口或本地网络本身发生了一个严重的失败。 |
WSAEINPROGRESS | 10036 | 一个阻塞操作正在执行。Windows Sockets只允许一个任务(或线程)在同一时间可以有一个未完成的阻塞操作,如果此时调用了任何函数,将返回该错误。 |
示例程序
1 #include <iostream> 2 #include <WinSock2.h> 3 #pragma comment(lib,"ws2_32.lib") 4 using namespace std; 5 6 const unsigned short MajorVersion = 2; //主版本号 7 const unsigned short MinorVersion = 2; //副版本号 8 9 int main() 10 { 11 WORD wdVersion = MAKEWORD(MajorVersion, MinorVersion); 12 WSAData wSocketInfo; 13 int nRet = WSAStartup(wdVersion, &wSocketInfo); 14 if (nRet != 0) 15 { 16 std::cout << "open error!" << std::endl; 17 return; 18 } 19 20 //版本检验 21 if (MinorVersion != HIBYTE(wSocketInfo.wVersion) || 22 MajorVersion != LOBYTE(wSocketInfo.wVersion)) 23 { 24 assert(0); 25 WSACleanup(); 26 return 0; 27 } 28 ... 29 30 WSACleanup(); 31 }
参考
Windows Sockets 错误码及出错原因-chenshko-ChinaUnix博客