TCP/IP协议select基础模型
一、准备工作
1.1打开网络库
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
WORD wdVersion = MAKEWORD(2, 1);
WSADATA wdsockMsg;
int nres = WSAStartup(wdVersion, &wdsockMsg);
if (0 != nres)
{
switch (nres)
{
case WSASYSNOTREADY:
printf("重启电脑或检查网络库");
break;
case WSAVERNOTSUPPORTED:
printf("更新网络库");
break;
case WSAEINPROGRESS:
printf("重启程序");
break;
case WSAEPROCLIM:
printf("关闭其他后台软件");
break;
}
}
说明:由于是截取的我的代码块,所以主函数(main)省略了并未标明,
#pragma comment(lib,“Ws2_32.lib”)是添加Winsock动态链接库(dll),除了使用这个以外,还可以手动添加,这是手动添加的教程,不再赘述https://stackoverflow.com/questions/22860675/what-can-be-used-instead-of-pragma-commentlib-ws2-32-lib/22860929
MAKEWORD();
宏函数,为确定使用网络库版本,2是低位字节,1是高位字节 ,如果输入的版本号不能使用(过高或过低),MAKEWORD();会自动使用当前库可使用的最高版本。
WSADATA
原型 :
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
#ifdef _WIN64
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
#else
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;
此结构主要使用前两个,其余成员做了解即可:
例如输入前面MAKEWORD(2,1);则wVersion为214,即0001为1,wHighVersion为548,即0010为2,符合前面说的高低位字节。
wVersion位建议使用的版本号wHighVersion为最高版本号
WSAStartup();
第一个参数为版本号(wVersion),第二个参数为指向WSADATA结构体的指针(&wdsockMsg)。函数成功返回0,否则返回错误码,错误码为整数,可用int类型装,对应错误码查询解决方案,也可以用WSAGetLastError函数查询错误码。
下次再更新。
我是Pico