C++ 10054连接到winsock时出错

C++ 10054连接到winsock时出错,c++,https,winsock,C++,Https,Winsock,我正在尝试建立安全(https)连接。在我的示例代码中,我试图通过端口443连接到www.yahoo.com。 虽然已建立连接,并且我能够发送HTTP连接请求,但服务器的响应是winsock错误10054。 我不确定我是否做错了什么。 任何帮助都将不胜感激 // HttpsTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #

我正在尝试建立安全(https)连接。在我的示例代码中,我试图通过端口443连接到www.yahoo.com。 虽然已建立连接,并且我能够发送HTTP连接请求,但服务器的响应是winsock错误10054。 我不确定我是否做错了什么。 任何帮助都将不胜感激

// HttpsTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <vector>
#include <WinSock2.h>

#define BUFFFER_SIZE    1024*1024
#define MESSAGE "CONNECT www.yahoo.com:443 HTTP/1.0\
User - Agent : Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv:11.0) like Gecko\
Host : www.yahoo.com\
    Content - Length : 0\
    DNT : 1\
    Proxy - Connection : Keep - Alive\
     Pragma : no - cache"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;

    WORD wVersionRequested = MAKEWORD(2, 2); //0x202

    int wsaError = ::WSAStartup(wVersionRequested, &wsaData);

    char *pBuffer = MESSAGE;

    string server_name("www.yahoo.com");
    int retval, Len;
    unsigned int addr;
    int socket_type = SOCK_STREAM;
    struct sockaddr_in server;
    struct hostent *hp = NULL;
    DWORD dwPort = 443;

    hp = gethostbyname(server_name.c_str());
    if (hp == NULL)
    {
        wsaError = ::WSAGetLastError();
    }

    memset(&server, 0, sizeof(server));
    memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(static_cast<u_short>(dwPort));

    SOCKET connToServer = socket(AF_INET, socket_type, IPPROTO_TCP); /* Open a socket */
    if (connToServer != INVALID_SOCKET)
    {
        if (connect(connToServer, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
        {
            wsaError = ::WSAGetLastError();
        }
    }
    Len = strlen(pBuffer);
    retval = send(connToServer, pBuffer, Len, 0);
    if (retval == SOCKET_ERROR)
    {
        wsaError = ::WSAGetLastError();
    }
    vector<char> vecBuffer(BUFFFER_SIZE, 0);
    retval = recv(connToServer, vecBuffer.data(), static_cast<int>(vecBuffer.capacity()) - 1, 0);
    if (retval == SOCKET_ERROR)
    {
        wsaError = ::WSAGetLastError(); // Always get a 10054.
    }

    return 0;
}
//HttpsTest.cpp:定义控制台应用程序的入口点。
//
#包括“stdafx.h”
#包括
#包括
#包括
#定义buffer_大小1024*1024
#定义消息“连接www.yahoo.com:443http/1.0\
用户代理:Mozilla/5.0(WindowsNT6.1;WOW64;Trident/7.0;rv:11.0)类似Gecko\
主持人:www.yahoo.com\
内容-长度:0\
DNT:1\
代理连接:保持活动状态\
Pragma:no-cache“
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
WSADATA WSADATA;
WORD wVersionRequested=MAKEWORD(2,2);//0x202
int wsaError=::WSAStartup(wVersionRequested和wsaData);
char*pBuffer=消息;
字符串服务器名称(“www.yahoo.com”);
内部检索,Len;
无符号整数地址;
int socket\u type=SOCK\u流;
服务器中的结构sockaddr_;
结构hostent*hp=NULL;
DWORD dwPort=443;
hp=gethostbyname(server_name.c_str());
如果(hp==NULL)
{
wsaError=::WSAGetLastError();
}
memset(&server,0,sizeof(server));
memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
server.sinu family=hp->h\u addrtype;
server.sin_port=htons(静态_cast(dwPort));
SOCKET connToServer=SOCKET(主机、套接字类型、IP协议);/*打开一个套接字*/
if(connToServer!=无效的\u套接字)
{
if(connect(connToServer,(struct sockaddr*)&server,sizeof(server))==SOCKET\u错误)
{
wsaError=::WSAGetLastError();
}
}
Len=strlen(pBuffer);
retval=send(connToServer,pBuffer,Len,0);
if(retval==SOCKET\u错误)
{
wsaError=::WSAGetLastError();
}
向量向量缓冲区(buffer_大小,0);
retval=recv(connToServer,vecBuffer.data(),static_cast(vecBuffer.capacity())-1,0);
if(retval==SOCKET\u错误)
{
wsaError=::WSAGetLastError();//始终获取10054。
}
返回0;
}

如果您想建立与加密协议的连接,为什么希望服务器响应未加密的请求?我就是这么做的吗?我应该不使用recv吗?这段代码与http一起工作,我试图检查如何使用httpsdo。你真的认为你发送相同的文本数据,但通过不同的端口,它就变得安全了吗?你们读过https协议的描述吗?我所尝试的只是通过扩展现有代理来提供隧道。我想我可能已经知道怎么回事了。谢谢你的帮助