C++ 下载的.exe不完整,C++;温索克

C++ 下载的.exe不完整,C++;温索克,c++,winsock,C++,Winsock,好吧,不管怎样,当我第一次开始的时候,我实际上是在下载实际的文件大小,但现在不是了。我有更多字符串的原因是,我可以创建一个子字符串,然后剪切HTML标题(然后在后面写入所有信息) 无论如何!认识WINSOCK的人能告诉我问题出在哪里吗?我想通过学习Winsock来了解事物的核心,所以请不要推荐其他API或其他东西。谢谢 我知道当人们将ofstream::write添加到他们的while循环中时,他们使用recv的返回,所以我将其全部添加,然后在最后放入ofstream::write,因为我认为这

好吧,不管怎样,当我第一次开始的时候,我实际上是在下载实际的文件大小,但现在不是了。我有更多字符串的原因是,我可以创建一个子字符串,然后剪切HTML标题(然后在后面写入所有信息)

无论如何!认识WINSOCK的人能告诉我问题出在哪里吗?我想通过学习Winsock来了解事物的核心,所以请不要推荐其他API或其他东西。谢谢

我知道当人们将ofstream::write添加到他们的while循环中时,他们使用recv的返回,所以我将其全部添加,然后在最后放入ofstream::write,因为我认为这是相同的。(如前所述,我没有把它放进去,因为我想删掉HTML标题)

#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#定义缓冲区\u LEN 4096
int main()
{
WSADATA WSADATA={0};
SOCKET ConnectSocket=无效的_套接字;
addrinfoW*ptr=nullptr,*result=nullptr,hints={0};
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
标准:流试验;
试一试{
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
投掷(1);
}
如果(GetAddrInfoW(L“www.mydati.com”、L“80”、&提示和结果)!=0){
投掷(2);
}
ptr=结果;
ConnectSocket=socket(ptr->ai_系列,ptr->ai_socktype,ptr->ai_协议);
if(ConnectSocket==无效的_套接字){
投掷(3);
}
如果(连接(ConnectSocket,ptr->ai_addr,ptr->ai_addrlen)!=0){
投掷(4);
}
std::字符串发送缓冲区;
SendBuffer=“GET//download/hss-win2/hss-773.exe/HTTP/1.1\r\n”;
SendBuffer+=“主机:www.mydati.com\r\n\r\n”;
send(ConnectSocket,SendBuffer.c_str(),SendBuffer.length(),0);
int ReturnBytes=0;
int=0;
std::string recvBufferTest,recvBufferTest2;
char recvBuffer[BUFFER_LEN]={0};
打开(“hostspotshield.txt”,std::ofstream::binary);
while(ReturnStuff=recv(ConnectSocket,recvBuffer,BUFFER_LEN,0)>0){
ReturnBytes=ReturnBytes+ReturnStuff;

STD::CUT> P>这个问题与Winsock无关,而是误用C++字符串。(注意,我还没用剩下的代码用一个好的牙齿梳子或任何东西,可能还有其他问题。但这是最突出的一个。) 当您说
recvBufferTest=recvBuffer
时,您使用的是等号运算符的第二种形式

指向以null结尾的字符序列的指针。该序列作为字符串的新值复制

[我的重点。]

因此,对于您获得的每个数据块,您将
recvBufferTest
设置为包含最多但不包括第一个空字符的字节,并丢弃其余的字节。由于您正在下载可执行文件,零字节将相当常见,因此您丢弃了大部分内容

相反,如果一个数据块恰好不包含零字节,
recvBufferTest
将包括内存中紧跟在
recvBuffer
之后的任何内存内容,直到但不包括第一个零字节。因此,如果要下载文本文件,您可能会发现它比预期的长

相反,您需要使用一种结构来指定数据缓冲区的长度

recvBufferTest.assign(recvBuffer, ReturnStuff);

在这个网站上,你为你的问题寻求解决方案,而不是人们试图为你找出问题并解决问题。标记为离题。你的意思是
while((ReturnStuff=recv(ConnectSocket,recvBuffer,BUFFER_LEN,0))>0)
我不是想成为一个混蛋,而是你的问题(如果有问题的话)不清楚。你应该询问具体的问题,包括你尝试过什么。在你的情况下,你粘贴代码并说“告诉我怎么了”.我的意思是…你至少有调试日志吗?输出,什么?我们在搜索什么?为我修复它的方法不属于这里,而是a我在这里遇到了问题,我尝试了这个,但它没有起到支持作用。它应该这样做…但却这样做了…,等等…@TrevinWorkery“…差不多一个小时…”这是一个可笑的短时间,直到你需要在堆栈溢出时询问。在你可能来这里之前,我会接受2-3天的艰苦研究。@Alejandro Iván好吧,对不起,我刚才在这里看到很多人态度很糟糕,但是!我要寻找的是为什么我的文件输出文件大小最终是5kb而不是13000+KB(我从互联网下载的文件)就像我拥有的一样。我将输出更改为.txt而不是.exe,以查看下载内容,其中似乎只有几行,而不是整个“recvBufferTest”
recvBufferTest.assign(recvBuffer, ReturnStuff);