Winsock - 连接问题

时间:2010-12-09 00:17:40

标签: c++ windows winsock

我正在建立一个小程序,每天从网站上下载一次。但每当我运行我的程序时,它输出“WSAConnectByName:返回FALSE,错误代码为10109”,根据MSDN上的列表为WSATYPE_NOT_FOUND(http://msdn.microsoft.com/en-us/library/ms740668%28v= VS.85%29.aspx)。我真的不明白我做错了什么。有人介意发现我的错误吗?

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

2 个答案:

答案 0 :(得分:3)

服务类型无效:这条改变的代码行为我工作。

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

根据Microsoft docs

  

服务名称是a的字符串别名   端口号。例如,“http”是一个   由80定义的端口80的别名   互联网工程任务组(IETF)   作为Web使用的默认端口   HTTP协议的服务器。   servicename的可能值   端口号不参数时的参数   指定的内容如下所示   文件:

     

%WINDIR%\ System32 \ drivers下\等\服务

答案 1 :(得分:1)

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