2010-12-09 74 views
0

我正在构建一个小程序,每天从网站上下载一次。但是,无论何时运行我的程序时,它都会根据MSDN上的列表输出“WSAConnectByName:返回错误代码为10109的FALSE”,即WSATYPE_NOT_FOUND(http://msdn.microsoft.com/zh-cn/library/ms740668%28v= VS.85%29.aspx)。我真的不明白我做错了什么。有没有人介意找到我的错误?Winsock - 与连接问题

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

回答

1

您需要一个端口/服务名称作为第三个参数。

3

服务类型无效:此改变的代码行适用于我。

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

Microsoft docs

服务名称是一个 端口号的字符串别名。例如,“http”是由 因特网工程任务组(IETF) 定义的端口80的 别名,作为用于HTTP协议的web 服务器使用的默认端口。对于服务名 参数 可能的值时,端口号是没有指定在以下 文件中列出 :WINDIR

%%\ SYSTEM32 \ DRIVERS \ etc \ services中

+0

哦,谢谢。我认为它只是应该是一个子目录或其他东西。 – 2010-12-09 00:57:37