工程背景:优化修改IOCP Kernel中的Socket复用策略
查询资料,要复用SOCKET,需要引入LPFN_DISCONNECTEX函数。
增加相关功能类后,编译时报错:
error C2146: 语法错误 : 缺少“;”(在标识符“m_pfnDisconnectEx”的前面)
查错过程如下:
1.检查头文件
#include <mswsock.h> ----------没有问题
2.检查代码,发现
LPFN_ACCEPTEX m_lpfnAcceptEx;
没有报错,使用右键-定义 可以跳转到mswsock.h文件中,而LPFN_DISCONNECTEX无法跳转到定义。
3.在mswsock.h文件中查看定义
原来LPFN_DISCONNECTEX和LPFN_ACCEPTEX有些差别
在LPFN_DISCONNECTEX的定义上面有宏定义
#if(_WIN32_WINNT >= 0x0501)
原因找到了: 没有默认定义_WIN32_WINNT导致的无法使用
4. 在stdafx.h中,所有包括的头文件之前,添加
#ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif
编译通过
因为没有关注过这个_WIN32_WINNT,折腾了很长时间才解决。
给个标准的定义
#ifndef WINVER
- #define WINVER 0×0501
- #endif
- #ifndef _WIN32_WINNT
- #define _WIN32_WINNT 0×0501
- #endif
- #ifndef _WIN32_WINDOWS
- #define _WIN32_WINDOWS 0×0501
- #endif
- #ifndef _WIN32_IE
- #define _WIN32_IE 0×0601
- #endif
如果没有显式定义,则还有一处需要关注到:
在Project Property –> Configuration Properties–> C/C++ -> Command Line的Additional Options框中输入:
/D“_WIN32_WINNT=0×0501”
如果操作系统是Windows server 2003,则上述0×0501处改为0×0502;若为Windows 7,则为0×0601。