C++ Redefinition Header Files (winsock2.h)
This problem is caused when including <windows.h>
before <winsock2.h>
. Try arrange your include list that <windows.h>
is included after <winsock2.h>
or define _WINSOCKAPI_
first:
#define _WINSOCKAPI_ // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h" // Which includes <winsock2.h>
See also this.
As others suggested, the problem is when windows.h
is included before WinSock2.h
. Because windows.h
includes winsock.h
. You can not use both WinSock2.h
and winsock.h
.
Solutions:
Include
WinSock2.h
beforewindows.h
. In the case of precompiled headers, you should solve it there. In the case of simple project, it is easy. However in big projects (especially when writing portable code, without precompiled headers) it can be very hard, because when your header withWinSock2.h
is included,windows.h
can be already included from some other header/implementation file.Define
WIN32_LEAN_AND_MEAN
beforewindows.h
or project wide. But it will exclude many other stuff you may need and you should include it by your own.Define
_WINSOCKAPI_
beforewindows.h
or project wide. But when you includeWinSock2.h
you get macro redefinition warning.Use
windows.h
instead ofWinSock2.h
whenwinsock.h
is enough for your project (in most cases it is). This will probably result in longer compilation time but solves any errors/warnings.
Oh - the ugliness of Windows... Order of includes are important here. You need to include winsock2.h before windows.h. Since windows.h is probably included from your precompiled header (stdafx.h), you will need to include winsock2.h from there:
#include <winsock2.h>
#include <windows.h>
By using "header guards":
#ifndef MYCLASS_H
#define MYCLASS_H
// This is unnecessary, see comments.
//#pragma once
// MyClass.h
#include <winsock2.h>
class MyClass
{
// methods
public:
MyClass(unsigned short port);
virtual ~MyClass(void);
};
#endif