【问题标题】:VC++ Winsock2 Error 10049. Trying to build IRC botVC++ Winsock2 错误 10049。尝试构建 IRC 机器人
【发布时间】:2011-09-01 19:58:07
【问题描述】:

我正在尝试将我的 IRC 机器人从 Python 移植到 C++,但在使用 Winsock2 时遇到了一些问题。我对 C/C++ 中的套接字相当陌生,并且大部分代码都是从各种教程拼凑而成的。我不断收到错误 10049 并且不知所措。任何帮助将不胜感激。谢谢!

port_ 设置为 6667,host_ 为“irc.rizon.net”

WSADATA wsaData;
int starterr = WSAStartup(MAKEWORD(2,2), &wsaData);
if (starterr != 0) {
    std::cout << "Error: " << WSAGetLastError() << " occurred!" << std::endl;
    WSACleanup();
    return 1;
}
std::cout << "WSAStartup Successful!" << std::endl;
socketfd_ = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (socketfd_ == INVALID_SOCKET) {
    std::cout << "Error: " << WSAGetLastError() << " occurred!" << std::endl;
    WSACleanup();
    return 1;
}
std::cout << "Socket Creation Successful!" << std::endl;

sockaddr_in anews;
anews.sin_port = htons(port_);
anews.sin_addr.s_addr = inet_addr(host_.c_str());
anews.sin_family = AF_INET;
if (connect(socketfd_,(sockaddr*)&anews, sizeof(anews)) == SOCKET_ERROR) {
    std::cout << "Error: " << WSAGetLastError() << " occurred!" << std::endl;
    WSACleanup();
    return 1;
}
std::cout << "Socket has connected successfuly!" << std::endl;
return 0;

【问题讨论】:

    标签: sockets networking irc winsock2


    【解决方案1】:

    inet_addr() 采用“x.x.x.x”形式的点式 IP 地址,您将主机名传递给它。

    你可以使用gethostbyname():

    hostent* host;
    char* ip;
    
    ...
    
    // Get the local host information
    host= gethostbyname(host_.c_str());
    ip= inet_ntoa(*(struct in_addr *)*host->h_addr_list);
    
    sockaddr_in anews;
    anews.sin_port = htons(port_);
    anews.sin_addr.s_addr = inet_addr(ip);
    anews.sin_family = AF_INET;
    
    ...
    

    或者更简单的方法是使用 getaddrinfo():

    struct addrinfo *ai;
    
    if(getaddrinfo(host_.c_str(), "6667", NULL, &ai) != 0)
        return 1;
    
    socketfd_ = socket(ai->ai_family, SOCK_STREAM, 0);
    if (socketfd_ == INVALID_SOCKET) {
        freeaddrinfo(ai);
        return 1
    }
    
    if (connect(socketfd_, ai->ai_addr, (int)ai->ai_addrlen) == SOCKET_ERROR) {
        closesocket(socketfd_);
        freeaddrinfo(ai);
        return 1;
    }
    
    ...
    

    【讨论】:

    • 现在抱怨ai没有初始化。 :\
    • ai 不需要初始化,因为它是一个输出参数,尽管您可以在传递给getaddrinfo() 之前将其初始化为NULL。无论如何,这将是一个最佳实践,但我相信这不是你的问题。你还在做WSAStartup() 对吧?
    • 我尝试将其初始化为 NULL 只是为了得到同样的抱怨。我还在使用 WSAStartup()。
    • 很抱歉,当我将其初始化为 NULL 时,这不是同一个投诉,这是 getaddrinfo() 的内存访问冲突。
    • 当不使用 NULL 并在初始化警告之后继续程序时,它会抱怨 socket() 的访问冲突
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2019-05-16
    • 2018-12-31
    相关资源
    最近更新 更多