
#include "lwip/raw.h"
#include "lwip/ip_addr.h"
#include "lwip/opt.h"

#include "lwip/def.h"
#include "lwip/memp.h"
#include "lwip/inet.h"
#include "lwip/ip_addr.h"
#include "lwip/netif.h"
#include "lwip/raw.h"

#include "lwip/stats.h"

#include "arch/perf.h"
#include "lwip/snmp.h"
 

#include "lwip/api.h"
#include "lwip/sys.h"
#include "config.h"

#include "global.h"
//#define  WIN32_LEAN_AND_MEAN
 
 
#define  print printf 

static const int client_close = 0;//CLIENT_CLOSE;
char target[]="http://202.115.27.34/index.html";
int portnumber,nbytes;
char host_addr[256];
char host_file[1024];
char local_file[256];
FILE * fp=NULL;
char request[1024];
char * pt=NULL;
int nsend, totalsend;
 
int client_init(const unsigned char remote_ip[4], short int remote_port)
{
	 struct tcp_pcb *pcb = NULL;
	 err_t ret_code = ERR_OK;
	 struct ip_addr remote_ipaddr;

	 pcb = tcp_new();
	 if(NULL == pcb)
	 {
		printf("tcp_new(): echec.\n\r");
		return -1;
	 }
 
	 tcp_arg(pcb, (void *)&client_close);
	 tcp_err(pcb, client_err);

	 IP4_ADDR(&remote_ipaddr, remote_ip[0], remote_ip[1], remote_ip[2], remote_ip[3]);

	 ret_code = tcp_connect(pcb, &remote_ipaddr, remote_port, client_connected);
	 if(ERR_OK != ret_code)
	 {
			 printf("tcp_connect(): error\n\r");
			 return -1;
	 }
 
	  printf("parameter.1 is: %s\n", target);
	  ToLowerCase(target);// 将参数转换为全小写
	  printf("lowercase parameter.1 is: %s\n", target);

	  GetHost(target, host_addr, host_file, &portnumber);//分析网址、端口、文件名等
	  printf("webhost:%s\n", host_addr);
	  printf("hostfile:%s\n", host_file);
	  printf("portnumber:%d\n\n", portnumber);

	  sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
                    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
                    Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber); 
      printf("%s", request);//准备request，将要发送给主机 

	  //取得真实的文件名 
	  if(host_file && *host_file) 
		  pt = Rstrchr(host_file, '/');
	  else pt = 0;

	  memset(local_file, 0, sizeof(local_file));
	  if(pt && *pt)
	  {
		if((pt + 1) && *(pt+1)) 
			strcpy(local_file, pt + 1);
		else 
			memcpy(local_file, host_file, strlen(host_file) - 1);
	  }
	  else if(host_file && *host_file) 
		  strcpy(local_file, host_file);
	  else  
		  strcpy(local_file, "index.html");
	  printf("local filename to write:%s\n\n", local_file);

	  //发送http请求request 
	  nsend = 0;totalsend = 0;
	  nbytes=strlen(request);
	  fp = fopen(local_file, "wb");
	  if(!fp)
	  {
		printf("create file error! %s\n", strerror(errno));
		return 0;
	  }

	 return 0;
 }
 err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
 {
     err_t ret_code = ERR_OK;

     if(ERR_OK == err)
	 {
         tcp_recv(pcb, client_recv);
         tcp_poll(pcb, client_poll, 2*POLL_INTERVAL);
     }
	 else
	 {
         printf("client_connected(): error\n\r");
         ret_code = err;
     }

     return ret_code;
 }

 void client_err(void *arg, err_t err)
 {
	 
     printf("error at client : ");
     print_err(err);
	 if(fp!=NULL)
	 {
		 fclose(fp);
		 // 开打下载的文件            
		 system(local_file);
	 }  
 } 
  err_t client_poll(void *arg, struct tcp_pcb *pcb)
 {
     struct pbuf *pbuf = NULL;
     err_t ret_code = ERR_OK;
     int client_close = *(int *)arg;
	 char buffer[32+1];
	 strcpy(buffer,"012345789012345789012345789");
		
     pbuf = pbuf_alloc(PBUF_TRANSPORT, 32, PBUF_RAM);
     if(pbuf != NULL)
	 {
            /*
             ((char *)pbuf->payload)[0] = 'S';
                         ((char *)pbuf->payload)[1] = 'M';
                         ((char *)pbuf->payload)[2] = 'P';
                         ((char *)pbuf->payload)[3] = '\0';*/
		  
		 strcpy( pbuf->payload,request); 
          pbuf->len=strlen(request);
             
             (void) tcp_write(pcb, pbuf->payload, pbuf->len, 1);
             tcp_sent(pcb, client_sent);
             
             pbuf_free(pbuf);

             if(1 == client_close)
                     ret_code = tcp_close(pcb);
     }

     return ret_code;
 }
  
  err_t client_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *pbuf, err_t err)
 {
     err_t ret_code = ERR_OK;
	 int i=0;
	 char *buffer=NULL;(char *)(pbuf->payload);

     if(ERR_OK == err)
	 {
		 if(pbuf != NULL)
		 {
			 printf("Donnees recues par le client : 0x");
		   //  putnum(pbuf->tot_len);
		   // tcp_write(pcb,pbuf->payload,pbuf->tot_len,0);
			 printf("%s\n",pbuf->payload);
		///////////////////////////////////////////////////////////////////	 
		
		  printf("\nThe following is the response header:\n");
		  i=pbuf->tot_len;
		  buffer=(char *)(pbuf->payload);
		  // 连接成功了，接收http响应，response 
		  //while((nbytes=recv(sockfd,buffer,1,0))==1)
		  {
			if(i < 4)
			{
			  if(buffer[0] == '\r' || buffer[0] == '\n')
				  i++;
			  else i = 0;
				 printf("%c", buffer[0]);// 把http头信息打印在屏幕上
			}
			else
			{
			  fwrite(buffer, 1, pbuf->tot_len, fp);// 将http主体信息写入文件
			  i++;
			  if(i%1024 == 0)  
				  fflush(fp);//每1K时存盘一次 
			}
		  } 
//////////////////////////////////////////////////////////////////////////////////////
			 tcp_recved(pcb, pbuf->tot_len);
         
			 pbuf_free(pbuf);
			 //ret_code = tcp_close(pcb);
		 }
     }
	 else
	 {
             printf("client_recv(): echec\n\r");
             ret_code = err;
     }

     return ret_code;
 }

err_t client_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
 {
     print("Donnees emises par le client : 0x");
 //    putnum(len);
     print("\n\r");

     return ERR_OK;
 }

 

 

 



