Winsock代码不工作 我已经完成了C++教程,去了Winsock,但这个主题还有点新。我制作了一个客户端代码,试图使用端口80(http)连接到一个网站,但每当我运行它时,就会得到一个错误代码10049,它无法连接到服务器。这是密码

Winsock代码不工作 我已经完成了C++教程,去了Winsock,但这个主题还有点新。我制作了一个客户端代码,试图使用端口80(http)连接到一个网站,但每当我运行它时,就会得到一个错误代码10049,它无法连接到服务器。这是密码,c++,winsock,C++,Winsock,辩护.h: #include <iostream> #include <winsock2.h> using namespace std; //Prototypes: WORD version = MAKEWORD(2, 2); WSADATA info; SOCKET hSocket; USHORT port; sockaddr_in hSockAddr; char website[50]; void initWSA(); void createSocket(); h

辩护.h:

#include <iostream>
#include <winsock2.h>

using namespace std;

//Prototypes:
WORD version = MAKEWORD(2, 2);
WSADATA info;
SOCKET hSocket;
USHORT port;
sockaddr_in hSockAddr;
char website[50];
void initWSA();
void createSocket();
hostent* websiteInfo;
void getPort();
void connectSocket();
void cleanUp();

//Functions:
void initWSA(){
    if(WSAStartup(version, &info) == 0){
        cout << "WinSock initialization successful!" << endl;
    }else{
        cout << "WinSock initialization failed!" << endl;
    }
}
void createSocket(){
    hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(hSocket != INVALID_SOCKET){
        cout << "Socket Creation Successful!" << endl;
    }else{
        cout << "Socket Creation Failed!" << endl;
    }
}
void getPort(){
    cout << "Enter the port number to connect to:" << endl;
}
void connectSocket(){
    if(connect(hSocket, (SOCKADDR*)&hSockAddr, sizeof(hSockAddr)) == 0){
        cout << "Connection to server successful!" << endl;
    }else{
        cout << "Connection to server failed! error code: " << WSAGetLastError() << endl;
    }
}

void cleanUp(){
    if(closesocket(hSocket) == 0){
        cout << "Socket Closure Successful!" << endl;
    }else{
        cout << "Socket Closure Failed!" << endl;
    }
    if(WSACleanup() == 0){
        cout << "WinSock cleanup successful!\a" << endl;
    }else{
        cout << "WinSock cleanup failed!\a" << endl;
    }
}
#包括
#包括
使用名称空间std;
//原型:
WORD版本=MAKEWORD(2,2);
WSADATA信息;
插座;
乌斯波特港;
hSockAddr中的sockaddr_;
char网站[50];
void initWSA();
void createSocket();
主持人*网站信息;
void getPort();
void connectSocket();
空洞清理();
//职能:
void initWSA(){
如果(WSAStartup(版本和信息)==0){
cout在这种情况下,请参见:

WSAEADDRNOTAVAIL
10049

无法分配请求的地址

请求的地址在其上下文中无效。这通常是由于尝试将
绑定到对本地计算机无效的地址而导致的。当远程地址或端口为对远程计算机无效(例如,地址或端口0)

你看到你的IP地址输出了吗?我想这不是你想要的

我认为您应该看到这个示例,以便获得IP地址:

Winsock程序员常见问题解答

示例:

问题在于如何将主机地址转换为ip

适用于ip地址:

inet_addr函数将包含IPv4点十进制地址的字符串转换为IN_addr结构的正确地址

而不是:

hSockAddr.sin_addr.S_un.S_addr = inet_addr("www.google.com");
使用:

请看这里:

[编辑]

正如Remy Lebeau在评论中所写,gethostbyname已被删除,应改用getaddrinfo,下面是使用getaddrinfo的示例代码:

  // Resolve host name
  struct addrinfo hints, *servinfo, *p;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  int rv;
  std::string str_port = std::to_string(port);
  if ((rv = getaddrinfo("www.google.com", str_port.c_str(), &hints, &servinfo)) != 0) {
    std::cerr << "getaddrinfo: " << rv << ": " << gai_strerrorA(rv) << std::endl;
    return 1;
  }

  // Loop over all returnd addresses, first one that works is the one we want to use
  for (p = servinfo; p != NULL; p = p->ai_next) {
    createSocket();
    if (connect(hSocket, p->ai_addr, p->ai_addrlen) == 0) {
      cout << "Connection to server successful!" << endl;
      break;
    }
    else {
      cout << "Connection to server failed! error code: " << WSAGetLastError() << endl;
      closesocket(hSocket);
    }
  }
  freeaddrinfo(servinfo);
//解析主机名
结构addrinfo提示,*servinfo,*p;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
int-rv;
std::string str_port=std::to_string(port);
if((rv=getaddrinfo(“www.google.com”,str_port.c_str(),&hits,&servinfo))!=0){

std::cerr您是否尝试搜索?
远程地址或端口对远程计算机无效(例如,地址或端口0)。
@AlgirdasPreidžius是的,我看到了页面,但我不太明白错误的意思:(无法分配请求的地址。)@TZHX但它们都是有效的???
inet_addr
不进行DNS查找,它需要一个“点十进制”IP地址,如“127.0.0.1”。不推荐使用,您应该改为使用。别忘了错误处理,DNS查找可能会失败。
struct hostent *he = gethostbyname("www.google.com");
memcpy(&hSockAddr.sin_addr, he->h_addr_list[0], he->h_length);

// Or:
//hSockAddr.sin_addr.s_addr = ((in_addr *)(he->h_addr))->s_addr;
  // Resolve host name
  struct addrinfo hints, *servinfo, *p;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  int rv;
  std::string str_port = std::to_string(port);
  if ((rv = getaddrinfo("www.google.com", str_port.c_str(), &hints, &servinfo)) != 0) {
    std::cerr << "getaddrinfo: " << rv << ": " << gai_strerrorA(rv) << std::endl;
    return 1;
  }

  // Loop over all returnd addresses, first one that works is the one we want to use
  for (p = servinfo; p != NULL; p = p->ai_next) {
    createSocket();
    if (connect(hSocket, p->ai_addr, p->ai_addrlen) == 0) {
      cout << "Connection to server successful!" << endl;
      break;
    }
    else {
      cout << "Connection to server failed! error code: " << WSAGetLastError() << endl;
      closesocket(hSocket);
    }
  }
  freeaddrinfo(servinfo);