2010-12-09 16 views
0

Ich baute ein kleines Programm, um etwas von einer Website einmal am Tag herunterzuladen. Aber jedes Mal, wenn ich mein Programm starte, gibt es "WSAConnectByName: FALSE mit dem Fehlercode 10109 zurückgegeben" aus. Das ist WSATYPE_NOT_FOUND gemäß der Liste auf MSDN (http://msdn.microsoft.com/en-us/library/ms740668%28v= VS.85% 29.aspx). Ich verstehe nicht wirklich, was ich falsch gemacht habe. Hat jemand etwas dagegen, meinen Fehler zu finden?Winsock - Problem mit dem Verbinden

#include <cstdio> 
#include <iostream> 
#include <string> 
#include <boost/format.hpp> 

#include <WinSock2.h> 
#include <Ws2tcpip.h> 
#include <windows.h> 

static const TCHAR s_lpctszAddress[] = TEXT("www.google.com"); 

int main(int argc, char* argv[]) 
{ 
    using namespace std; 
    using namespace boost; 

    WSADATA wsaData; 
    int iWSAStartup = WSAStartup(MAKEWORD(2, 2), &wsaData); 

    if (!iWSAStartup) 
    { 
     SOCKET Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0); 
     if (Socket != INVALID_SOCKET) 
     { 
     INT iSize = sizeof(s_lpctszAddress); 
     SOCKADDR saAddr; 
     DWORD dwSOCKADDRLen = sizeof(saAddr); 
     BOOL fConnect = WSAConnectByName(Socket, const_cast<LPWSTR>(s_lpctszAddress), TEXT("/"), &dwSOCKADDRLen, &saAddr, NULL, NULL, NULL, NULL); 
     if (fConnect == TRUE) 
     { 
      cout << "Success!"; 
     } 
     else 
     { 
      cout << format("WSAConnectByName: returned FALSE with error code %1%.") % WSAGetLastError() << endl; 
     } 
     } 
     else 
     { 
     cout << format("WSASocket: returned INVALID_SOCKET with error %1%.") % WSAGetLastError() << endl; 
     } 
    } 
    else 
    { 
     cout << format("WSAStartup: returned %1% with error %2%.") % iWSAStartup % WSAGetLastError() << endl; 
    } 

    return 0; 
} 

Antwort

1

Sie benötigen einen Port/Service-Namen als dritten Parameter.

3

Service-Typ ist nicht gültig: diese geänderte Codezeile funktionierte für mich.

BOOL fConnect = WSAConnectByName(Socket, const_cast<LPWSTR>(s_lpctszAddress), 
    TEXT("http"), &dwSOCKADDRLen, &saAddr, NULL, NULL, NULL, NULL); 

Per der Microsoft docs:

Ein Service-Name ist ein String-Alias ​​für eine Portnummer. Zum Beispiel ist "http" ein Alias ​​für Port 80, definiert durch die Internet Engineering Task Force (IETF) als Standard-Port, der von Web-Servern für das HTTP-Protokoll verwendet wird. Mögliche Werte für die service Parameter, wenn eine Portnummer nicht ist, sind in der folgenden Datei angegeben aufgelistet:

% windir% \ system32 \ drivers \ etc \ services

+0

Oh, danke. Ich dachte, es sollte nur ein Unterverzeichnis oder so etwas sein. –

+0

kein Problem, viel Glück –