Tôi vừa mới bắt đầu tìm hiểu winsock thông qua sách hướng dẫn "Lập trình Beej để lập trình mạng". Tôi đang lập trình dưới các cửa sổ và chạy nó thông qua gcc. Đây chỉ là một khởi đầu để viết chương trình máy chủ đầu tiên của tôi nhưng nó mang lại cho tôi những lỗi này khi tôi cố gắng biên dịch.lỗi biên dịch winsock, nó không thể tìm thấy cấu trúc addrinfo và một số chức năng liên quan
/* 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;
}
đây là những lỗi Tôi nhận
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.
nên không phải là cấu trúc và chức năng được quy định tại một trong hai windows.h hoặc winsock.h ?.
SOLUTION
EDIT cho bất cứ ai tình cờ về vấn đề này, thêm
#define _WIN32_WINNT 0x501
#include <ws2tcpip.h>
ở đầu nguồn của bạn nếu getaddrinfo nói rằng không khai báo của nó.
hey cảm ơn vì điều đó #define _WIN32_WINNT 0x501 đã lưu cho tôi một số sự cố :) – Lefteris
Không có vấn đề :-). – silent
Tôi đang ở trên Win7, VS2015, và cho đến nay tôi chưa phải thêm câu lệnh #define, nhưng DID cần thêm câu lệnh #include. Công cụ xây dựng của tôi có thể hơi lạ vì tôi đang làm việc với một bộ thư viện cũ. – Andrew