我刚开始通过“Beej's guide to network programming”这本书学习winsock,我在windows下编程,并通过gcc运行它,这只是我第一次编写服务器程序的开始,但当我试图编译时,它给了我这些错误。
/* Server */
#include <iostream>
#include <windows.h>
#include <winsock2.h>
using namespace std;
const int winsockVersion = 2;
#define BACKLOG 10
#define PORT 3000
int main(void){
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsockVersion,0),&wsadata) == 0){
struct addrinfo hints, *res;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ( getaddrinfo(NULL,PORT,&hints,&res) == 0 ){
cout<<"-Call to get addrinfo successful!." << endl;
}
cout<<"res af_family" << res->ai_family << endl;
}
//clear stuff
if( WSACleanup() != 0){
cout<<"-WSACleanup unsuccessful" << endl;
}else{
cout<<"-WSACleanup successful" << endl;
}
return 0;
}
这些是我收到的错误
g++ -o server.exe server.cpp -lws2_32
Process started >>>
server.cpp: In function `int main()':
server.cpp:20: error: aggregate `addrinfo hints' has incomplete type and cannot be defined
server.cpp:25: error: `AI_PASSIVE' was not declared in this scope
server.cpp:27: error: `getaddrinfo' was not declared in this scope
server.cpp:31: error: invalid use of undefined type `struct addrinfo'
server.cpp:20: error: forward declaration of `struct addrinfo'
server.cpp:54:2: warning: no newline at end of file
<<< Process finished.
结构和函数不应该在windows.h或winsock.h中定义吗?
解决方案
EDIT对于任何无意中发现此内容的人,请添加
#define _WIN32_WINNT 0x501
#include <ws2tcpip.h>
如果getaddrinfo说它是未声明的,那么在源代码的顶部。
6条答案
按热度按时间uajslkp61#
你可能想
#include <ws2tcpip.h>
.记住在Stack Overflow之前,Google是你解决这类问题的朋友:您将立即从MSDN获得答案!niwlg2el2#
MSDN说我们应该
#include <ws2tcpip.h>
,但在ws2tcpip.h
中我发现了这段代码:这意味着,
_WIN32_WINNT
的定义比_WIN32_WINNT_WINXP
低,但是当我尝试包含wspiapi.h
时,我得到了"no such file or directory"
。我猜,这是MinGW的错误,库的不同部分有不一致的版本。在包含ws2tcpip.h
之前,你必须自己定义#define _WIN32_WINNT _WIN32_WINNT_WINXP
vfh0ocws3#
**注意!**您的包含错误。问题是
windows.h
已经包含winsock.h
和winsock2.h
,然后重新定义了一些结构和函数,导致大量编译错误。将windows.h
包含移动到winsock2.h
包含下面,或者只是完全删除windows.h
包含,winsock2.h
包含windows.h
。uoifb46i4#
我能够让它与下面的包含、杂注和定义一起工作...
此答案的必要包含列表显示在Microsoft文章中:Winsock Includes
jyztefdp5#
这对我很有效:
oknwwptz6#
在我的例子中,我在声明
sockaddr_in
时添加了struct
。变更日期:
sockaddr_in m_sockAddr;
到
struct sockaddr_in m_sockAddr;
而且,
bind(sock, (sockaddr*)&m_sockAddr, sizeof(m_sockAddrLsng ))
到
bind(m_sockLsng, (struct sockaddr*)&m_sockAddr, sizeof(m_sockAddr))