2010-12-09 5 views
0

Je construisais un petit programme pour télécharger quelque chose à partir d'un site Web une fois par jour. Mais chaque fois que j'exécute mon programme, il sort "WSAConnectByName: retourné FALSE avec le code d'erreur 10109", qui est WSATYPE_NOT_FOUND selon la liste sur MSDN (http://msdn.microsoft.com/fr-fr/library/ms740668%28v= VS.85% 29.aspx). Je ne comprends pas vraiment ce que j'ai mal fait. Est-ce que quelqu'un détecte mon erreur?Winsock - problème avec la connexion

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

Répondre

1

Vous avez besoin d'un nom de port/service en tant que troisième paramètre.

3

Le type de service n'est pas valide: cette ligne de code modifiée a fonctionné pour moi.

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

par le Microsoft docs:

Un nom de service est un alias de chaîne pour un numéro de port . Par exemple, "http" est un alias pour le port 80 défini par l' Internet Engineering Task Force (IETF) comme port par défaut utilisé par les serveurs Web pour le protocole HTTP. Les valeurs possibles pour le paramètre servicename lorsqu'un numéro de port n'est pas spécifié sont répertoriés dans le fichier suivant:

% windir% \ system32 \ drivers \ etc \ services

+0

Oh, merci. Je pensais que c'était supposé être un sous-répertoire ou quelque chose comme ça. –

+0

pas de problème, bonne chance –