【问题标题】:Winsock - issue with connectingWinsock - 连接问题
【发布时间】:2016-06-01 00:42:06
【问题描述】:

我正在构建一个小程序,每天从网站下载一次内容。但是每当我运行我的程序时,它都会输出“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;
}

【问题讨论】:

    标签: c++ windows winsock


    【解决方案1】:

    服务类型无效:这行修改后的代码对我有用。

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

    根据Microsoft docs

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

    %WINDIR%\system32\drivers\etc\services

    【讨论】:

    • 哦,谢谢。我以为它只是应该是一个子目录或其他东西。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多