2011-09-01 2 views
0

IRC 봇을 Python에서 C++로 이식하려고하는데 Winsock2와 관련된 몇 가지 문제가 있습니다. 나는 C/C++ 소켓에 상당히 익숙하다. 그리고이 코드의 대부분은 다양한 튜토리얼에서 결합되었다. 10049 오류가 계속 발생하고 손실이 발생합니다. 어떤 도움이라도 대단히 감사 할 것입니다. 감사!VC++ Winsock2 오류 10049. IRC 봇 빌드 시도

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'는'getaddrinfo()'에 전달되기 전에'NULL'로 초기화 할 수 있지만 out 매개 변수이기 때문에 초기화 할 필요가 없습니다. 그것은 어쨌든 모범 사례 일 것이지만 당신의 문제가 아니라고 확신합니다. 당신은 아직도'WSAStartup()'을하고 있습니까? –

+0

동일한 불만을 얻기 위해서만 NULL로 초기화하려고했습니다. 나는 여전히 WSAStartup()을 사용하고있다. – user924154