下面的程序演示了如何获取主机上的文件
用winsock要包含头文件winsock2.h包含库Ws2_32.lib
或者包含头文件winsock.h库wsock32.lib
程序没有注释,因为最近比较忙
写程序也心浮气躁
见谅
#include <winsock2.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <stdio.h>
void get_file(char *host_ip,char *file);
void get_ip(char *host_name,char *ip);
int main(int argc,char ** argv)
{
char add_str[256];
char *temp_str;
char host_ip[16];
char file_str[256]={0};
int len=0;
while(1)
{
memset(add_str,0,256);
memset(host_ip,0,16);
memset(file_str,0,256);
printf("web address:");
scanf("%s",add_str);
if(strcmp(add_str,"exit") ==0 )break;
//the style of web address like this
//"http://www.54sh.com/index/index.aspx"
temp_str = strtok(add_str,": /");
if(strcmp(temp_str,"http") != 0)
printf("only 'http' be seported!!");
//so it just like this
//"http","www.54sh.com","index","index.aspx"
temp_str = strtok(NULL,": /");
get_ip(temp_str,host_ip);
temp_str = strtok(NULL,": /");
while(temp_str != NULL)
{
strcpy(file_str+len,temp_str);
len += strlen(temp_str);
file_str[len++] = '/';
temp_str = strtok(NULL,": /");
}
file_str[len-1] = 0;
get_file(host_ip,file_str);
}
printf("exiting...");
return 0;
}
void get_file(char *host_ip,char *file)
{
FILE *pfile;
WSADATA ws;
SOCKET sock;
int result;
struct sockaddr_in addr;
char order[256];
char buf[100];
WSAStartup(0x0101,&ws);
sock = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr(host_ip);
result = connect(sock,(struct sockaddr *)&addr,sizeof(addr));
printf("/nconnecting to host %s .../n",host_ip);
if(SOCKET_ERROR == result)
{
WSACleanup();
printf("/n can not connet to host %s/n",host_ip);
}
else
{
printf("/nconnect ok,start to get file.../n");
strcpy(order,"GET /");
strcpy(order+5,file);
int len = strlen(order);
strcpy(order + len ," /r/n");
// if(strcmp(file,"") == 0)
strcpy(file,"index.htm");
pfile = fopen(file,"w");
result = send(sock,order,strlen(order),0);
do
{
result = recv(sock,buf,100,0);
buf[result] = 0;
fwrite(buf,1,strlen(buf),pfile);
printf(buf);
}while(result != 0);
fclose(pfile);
}
WSACleanup();
}
void get_ip(char *host_name,char *ip)
{
WSADATA ws;
WSAStartup(0x0101,&ws);
hostent *phent;
phent = gethostbyname(host_name);
strcpy(ip,inet_ntoa(*(in_addr *)(phent->h_addr_list[0])));
WSACleanup();
}