Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 套接字错误可以';t在WinSock2.h中获取函数_C++_C_Windows_Sockets - Fatal编程技术网

C++ 套接字错误可以';t在WinSock2.h中获取函数

C++ 套接字错误可以';t在WinSock2.h中获取函数,c++,c,windows,sockets,C++,C,Windows,Sockets,我已经创建了一个套接字包装类,但是我有太多的错误,我无法解决。我试了又试,但没有用 代码如下: //#define WIN32_LEAN_AND_MEAN #include <iostream> #include <string> #include <Windows.h> #include <WinSock2.h> #include <WS2tcpip.h> #pragma comment(lib,"ws2_32_lib") usin

我已经创建了一个套接字包装类,但是我有太多的错误,我无法解决。我试了又试,但没有用

代码如下:

//#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <string>
#include <Windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma  comment(lib,"ws2_32_lib")
using namespace std;
#define WM_SOCKET 0x10000

class Socket 
{


}; 

您需要按如下方式重新排列Windows标题的包含项:

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>

在包含WinSock2之前不能包含Windows.h,因为这将导致Windows标头包含旧版本的winsock。拆下车窗。h包括所有车窗

例如,请参见此MSDN链接: 第一个代码块下的注释部分解释了这一点。

我确保在任何#include“windows.h”和#include“Winsock.h”之前有一个#include“Winsock2.h”,这就解决了这个问题

耐心一点,逐个查看includes并建立顺序,首先包括“Winsock2.h”,然后包括“windows.h”


我检查了recursive includes,我发现头文件包含(递归地)一些#include“windows.h”和#include“Winsock.h”,并编写了一个#include“Winsock2.h”。在这个文件中,我添加了#include“Winsock2.h”`作为第一个include。

如果事先定义了
\u WINSOCKAPI
,可以在
Winsock2.h
之前包含
windows.h
。这将禁用默认情况下包含的
winsock.h
。@RemyLebeau:您知道该定义是否为“可移植”(即在所有版本的SDK中相同)吗?。MSDN页面上说您可以定义
WIN32\u LEAN\u和_MEAN
,但这并不总是一个选项。无论如何,我认为最好让Winsock2包含windows标题。是的,所有SDK版本中的定义都是相同的。它是头保护,用于保护
winsock.h
的内容不受多个包含项的影响
winsock2.h
定义了
\u WINSOCKAPI
以禁用
winsock.h
如果在包含
winsock.h
之前包含
winock2.h
,以避免多个声明错误
winsock2.h
不包括windows标题。在我的例子中,我只是在任何地方都包括WS2TCIP.h(其他两个文件不包括在内,因为它们都包含在这个文件中)。但对于许多函数,我仍然会遇到重新定义错误。大多数函数都在#if INCL_WINSOCK_API_prototype块下声明,该块定义为1。你能给我一些建议吗?谢谢你的帮助!在我的例子中,我只是到处都包含
ws2tcip.h
(其他两个文件不包括在内,因为它们都包含在这个文件中)。但对于许多函数,我仍然会得到
重新定义错误。这些函数大部分在定义为1的
#if INCL_WINSOCK_API_prototype
块下声明。你能给我一些建议吗?谢谢你的帮助!一个空的C++文件只有两行<代码> >包括和 >包含给了我很多错误(VS2005)。第一条错误消息是错误1错误C2146:语法错误:缺少“;”在标识符“Byte”之前,C:\Program Files\Microsoft SDK\Windows\v6.0\Include\in6addr.h 24在
\Include
\Include
之间有
\Include
修复了这个问题。在我的例子中,我只是到处都包含ws2tcpp.h(其他两个文件不包括在内,因为它们在这一个文件的内部).但我仍然得到许多函数的重新定义错误。大多数函数都在#if INCL_WINSOCK_API_prototype块下声明,该块定义为1。你能给我一些建议吗?谢谢你的帮助!
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32")