2011-09-01 85 views
0

我試圖將我的IRC bot從Python移植到C++,並且遇到了一些Winsock2問題。我對C/C++中的套接字相當陌生,大部分代碼都是從各種教程拼湊而成的。我不斷收到錯誤10049,並且無所適從。任何幫助將不勝感激。謝謝!VC++ Winsock2 Error 10049.試圖構建IRC bot

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; 

回答

0

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; 
} 

... 
+0

它的抱怨關於艾未初始化現在。 :\ – user924154

+0

'ai'不應該被初始化,因爲它是一個out參數,雖然你可以在它傳遞給getaddrinfo()之前將它初始化爲NULL。無論如何,這將是一個最佳做法,但我相信這不是你的問題。你仍然在做'WSAStartup()'對嗎? –

+0

我試圖將它初始化爲NULL,以獲得相同的投訴。我還在使用WSAStartup()。 – user924154