VC ++ Winsock2 Ошибка 10049. Попытка собрать IRC-бот - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь перенести своего 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;

1 Ответ

0 голосов
/ 02 сентября 2011

inet_addr() принимает точечный IP-адрес в форме "xxxx", которому вы передаете имя хоста.

Вы можете использовать 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;
}

...
...