求教,如何用winsock实现下载

cdsun 2006-07-03 10:09:29
求教,如何用winsock实现下载

本人新手

现在开始学习c++基于sdk开发

想做一个下载的功能,但是不知道如何下手各位,请指点

我的开发环境xp+vs.net2003

用的win32控制台开发

请指点
...全文
225 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdsun 2006-07-10
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <winsock.h>
//#include <wininet.h>
#include <windows.h>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"wininet.lib")

char fname[MAX_PATH];
void LogFile(char *p)
{
FILE *fp=fopen(fname,"a+");
fprintf(fp,"%s\n",p);
fclose(fp);
}



bool httpdownload(void)
{
WSADATA ws;
SOCKET s;
int i=0;
struct sockaddr_in addr;

int iResult;
long lResult;
char strSubAddr[8192], strBuffer[8192];

lResult = WSAStartup(0x0101,&ws);
int err=WSAStartup(lResult,&ws);
//如果不能初始化WinSock,退出
if(err==-1){
perror("WSAStartup");
exit(1);
}
else
{
printf("创建winsock成功!\n");
}


s = socket(AF_INET,SOCK_STREAM,0);
if(s<0){
perror("Opening stream socket");
exit(1);
}

HOSTENT* ph=gethostbyname("www.aiiyoo.com");//获得主机名
if(NULL==ph){
printf("gethostbyname=%d\r\n",WSAGetLastError());
return 0;
}

addr.sin_family = AF_INET;
addr.sin_port = htons(80);
//addr.sin_addr.s_addr = inet_addr("168.160.224.185"); // 计算机世界日报
addr.sin_addr.S_un.S_addr=*(LPDWORD(ph->h_addr_list[0]));
iResult=connect(s,(struct sockaddr *) &addr, sizeof(addr));
if(SOCKET_ERROR == iResult)
{
// 连接失败
closesocket(s);
WSACleanup();
printf("连接远程主机...失败!\n");
return false;
}
else
{
// 连接成功
strcpy(strSubAddr, "GET /lover/pic/ HTTP/1.1\r\nHost: www.aiiyoo.com\r\n\r\n");
strcpy(fname, "2006621132323.jpg");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
printf("建立连接远程主机...成功!\n");
}
// 下载文件
strset(strBuffer, 8192);
printf("%d\n",iResult);
iResult = recv(s,strBuffer,sizeof(strBuffer),0);
char* p=strstr(strBuffer,"\r\n\r\n");
LogFile(p+4);

do
{
strset(strBuffer, 8192);
i=i+1;

iResult = recv(s,strBuffer,sizeof(strBuffer),0);
printf("%d\n",iResult);
LogFile(strBuffer);

} while(iResult!=0);

closesocket(s);
WSACleanup();
printf("it's ok!");
return 0;
}

int main(int argc, CHAR* argv[])
{
httpdownload();
}



以上是我的代码。下载网页文件很快为什么下载其他类型的文件比如图片或者可执行文件都很慢。是非常的曼是为什么呢

大家能不能给点点例子看看呢
cdsun 2006-07-06
  • 打赏
  • 举报
回复
谁能给一个例子看看
god_sun 2006-07-06
  • 打赏
  • 举报
回复
就用recv(),send().把你要下载的文件以2进制的形式读入buff,太大可以分段下载
cangwu_lee 2006-07-06
  • 打赏
  • 举报
回复
没有办法帮到什么
programhunter 2006-07-06
  • 打赏
  • 举报
回复
用winsock下载?你先把HTTP,FTP等协议弄清楚才行.
每种协议格式,包的要求搞清楚,然后就能下了.

现在ms提供有Internet API,暴雪的下载器也是用这种API,建议你还是看看MSN,用这种API比较好.

fdimim 2006-07-05
  • 打赏
  • 举报
回复
用winsock下载?那就是c/s模式的了,你告诉服务器你想要什么东西,然后它就传那个东西给你了。 这不就下载了吗。 猜的

嫌麻烦,直接用 URLDownloadToFile 就好了。
cdsun 2006-07-05
  • 打赏
  • 举报
回复
没有人帮忙啊
cdsun 2006-07-05
  • 打赏
  • 举报
回复
自己顶一下
superxiaomm 2006-07-03
  • 打赏
  • 举报
回复
就TCP/IP通讯亚
cdsun 2006-07-03
  • 打赏
  • 举报
回复
没有人帮帮忙啊?
avfff 2006-07-03
  • 打赏
  • 举报
回复
精神可嘉,我在Win32 SDK这方面也是新手。互相学习。
cdsun 2006-07-03
  • 打赏
  • 举报
回复
你说的那个是不是太复杂了些
我只想实现下载

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧