winsock 编程之初步

下面的程序演示了如何获取主机上的文件

用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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值