26. oktober 2002 - 18:46
Der er
10 kommentarer og
2 løsninger
download i c++
Hvad skal jeg skrive for at downloade en fil fra nettet
mit console program ser ud som dette
#include <iostream.h>
int main()
{
cout << "Vent venligst...downloader";
}
det må gerne vise hvor langt det er noget, men behøves ikke
26. oktober 2002 - 18:59
#1
Hvis du vil downloade med HTTP protokollen, så:
- åbner du en socket til den relevante host på port 80
- sender "GET path-på-det-du-vil-have HTTP/1.0\r\n\r\n"
- læser headerne i svaret indtil der komemr en blank linie
- læser filen
26. oktober 2002 - 19:49
#3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <socket.h>
#include <netdb.h>
#include <unixio.h>
#include <errno.h>
void test(char *hostname,int port,char *path,char *fnm)
{
FILE *fp;
int sd,status,len,tmp,data,ix;
char cmd[512],resp[5120];
struct sockaddr local,remote;
struct hostent *hostinfo;
/* create socket */
sd=socket(AF_INET,SOCK_STREAM,0);
if(sd<0) {
printf("Error creating socket: %s\n",strerror(errno));
goto fin;
}
/* bind socket */
local.sa_family=AF_INET;
memset(local.sa_data,0,sizeof(local.sa_data));
status=bind(sd,&local,sizeof(local));
if(status<0) {
printf("Error binding socket: %s\n",strerror(errno));
goto fin;
}
/* lookup host */
hostinfo=gethostbyname(hostname);
if(!hostinfo) {
printf("Error looking up host: %s\n",hostname);
goto fin;
}
/* connect to host */
remote.sa_family=hostinfo->h_addrtype;
memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
*((short *)remote.sa_data)=port;
tmp=remote.sa_data[0];
remote.sa_data[0]=remote.sa_data[1];
remote.sa_data[1]=tmp;
status=connect(sd,&remote,sizeof(remote));
if(status!=0) {
printf("Error connecting to host: %s port: %d\n",hostname,port);
goto fin;
}
/* send GET request */
sprintf(cmd,"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n",path,hostname);
status=send(sd,cmd,strlen(cmd),0);
if(status<0) {
printf("Error sending GET request\n");
goto fin;
}
/* read header */
data=0;
while ((len=recv(sd,resp,sizeof(resp),0))>0) {
if(!data) {
ix = strstr(resp,"\r\n\r\n") - resp + 4;
fp = fopen(fnm,"wb");
data=1;
fwrite(resp+ix,len-ix,1,fp);
} else {
fwrite(resp,len,1,fp);
}
}
fclose(fp);
fin:
close(sd);
return;
}
26. oktober 2002 - 19:51
#4
Og så kommer alle men'erne:
- du skal muligvis inkludere andre header-filer
alt afhængig af din platform
- nogle web-servere kan muligvis finde på kun
ad askille header records med \r eller \n i.s.f. \r\n
- koden forudsætter at data starter inden d.v.s. at headerne
er mindre end 5120 bytes