⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_http.c

📁 本程序功能为在FPGA上nios处理器的网卡接口程序。
💻 C
字号:
#include "stdio.h"
#include "alt_types.h"


void APP_HTTP(void)     //http应用处理程序
{
   UINT i,Len=Start_HTTP,Data_Len;
   //UINT Open_Count_Len;  //打开网页次数用ASC码表示时占用的字节数
   //UINT Content_Len_Len;  //实体长度用ASC码表示时占用的字节数
   //UINT Content_Len_DEC;  //实体长度
   //UINT Receive_PACK_HTTP_Len;  //收到数据包中http的长度

   //Receive_PACK_HTTP_Len=Receive_Buffer[14+2]*0x100+Receive_Buffer[14+2+1]-40;


   Open_Count++;
   Open_Count_ASC_Byte=Change_Dec_ASC(Open_Count,Open_Count_ASC);  //打开次数用ASC码表示时占用的字节数
   Content_Len=Open_Count_ASC_Byte+sizeof(web_page1)+sizeof(web_page2);  //实长度的整数表示
   Content_Len_ASC_Byte=Change_Dec_ASC(Content_Len,Content_Len_ASC);  //实体长度用ASC码表示时占用的字节数

   Data_Len=sizeof(html_header1)-1;
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=html_header1[i];  //写HTTP头

   for (i=0;i<Content_Len_ASC_Byte;i++)
      Send_Buffer[Len++]=Content_Len_ASC[Content_Len_ASC_Byte-i-1]; //实体长度

   Data_Len=sizeof(html_header2);
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=html_header2[i];
//-----------------------------------------------------------------------------------
   Data_Len=sizeof(web_page1)-1;
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=web_page1[i];

   for (i=0;i<Open_Count_ASC_Byte;i++)
      Send_Buffer[Len++]=Open_Count_ASC[Open_Count_ASC_Byte-i-1];

   Data_Len=sizeof(web_page2);
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=web_page2[i];     //写HTTP实体
//-----------------------------------------------------------------------------------
   DATA_Len_HTTP=Len-Start_HTTP;          //HTTP全部数据长度
   DATA_Len_TCP=DATA_Len_HTTP+20;         //TCP包数据总长度
   IP_PACK_Len=DATA_Len_TCP+20;           //IP包数据长度
   TCP_ISN_A=TCP_ISN_O+Receive_PACK_HTTP_Len;
   TCP_Symbol_Send=0x18;                  //TCP标志,ACK  PSH

   HEAD_TCP();       //TCP首部
   HEAD_IP();        //IP首部
   HEAD_Ethernet();  //以太网头

   NET_Send_Packet(Send_Buffer,Len);  //发送数据包
   //printf("发送HTTP数据包 Http数据长度为 %d \n",DATA_Len_HTTP);
   TCP_ISN+=DATA_Len_HTTP;

   /*DATA_Len_TCP=20;
   IP_PACK_Len=DATA_Len_TCP+20;
   TCP_Symbol_Send=0x11;  //?  似乎可以改成0x01

   HEAD_TCP();
   HEAD_IP();
   HEAD_Ethernet();

   NET_Send_Packet(Send_Buffer,Start_HTTP);
   TCP_ISN++;*/

   //TCP_State=4;  //理论上应该是4
}

void Send_HTTP_Response(void)  //发送HTTP的请求响应包
{
   UINT i,Len=Start_HTTP,Data_Len;
   //UINT Open_Count_ASC_Byte;  //打开次数用ASC码表示时占用的字节数
   //UINT Content_Len;          //http内容长度
   //UINT Content_Len_ASC_Byte;   //内容长度用ASC码表示时占用的字节数
   //UINT Receive_PACK_HTTP_Len;  //收到的HTTP包中,http数据长度

   //Receive_PACK_HTTP_Len=Receive_Buffer[14+2]*0x100+Receive_Buffer[14+2+1]-40;

   Open_Count++;
   Open_Count_ASC_Byte=Change_Dec_ASC(Open_Count,Open_Count_ASC);
   Content_Len=Open_Count_ASC_Byte+sizeof(web_page1)+sizeof(web_page2);  //HTTP内容长度
   Content_Len_ASC_Byte=Change_Dec_ASC(Content_Len,Content_Len_ASC);

   Data_Len=sizeof(html_header1)-1;
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=html_header1[i];  //写HTTP头

   for (i=0;i<Content_Len_ASC_Byte;i++)
      Send_Buffer[Len++]=Content_Len_ASC[Content_Len_ASC_Byte-i-1]; //实体长度

   Data_Len=sizeof(html_header2);
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=html_header2[i];

   DATA_Len_HTTP=Len-Start_HTTP;  //HTTP包长度
   DATA_Len_TCP=DATA_Len_HTTP+20;  //TCP数据包长度
   IP_PACK_Len=DATA_Len_TCP+20;
   TCP_ISN_A=TCP_ISN_O+Receive_PACK_HTTP_Len;
   TCP_Symbol_Send=0x18;   //ACK  PSH

   HEAD_TCP();
   HEAD_IP();
   HEAD_Ethernet();

   NET_Send_Packet(Send_Buffer,Len);  //发送数据包

   TCP_ISN+=DATA_Len_HTTP;
}

void Send_HTTP_Content(void)  //发送HTTP的内容数据包
{
   UINT i,Len=Start_HTTP,Data_Len;
   //UINT HTTP_Data_Len;
   //UINT TCP_Data_Len;

   Data_Len=sizeof(web_page1)-1;
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=web_page1[i];

   for (i=0;i<Open_Count_ASC_Byte;i++)
      Send_Buffer[Len++]=Open_Count_ASC[Open_Count_ASC_Byte-i-1];

   Data_Len=sizeof(web_page2);
   for (i=0;i<Data_Len;i++)
      Send_Buffer[Len++]=web_page2[i];

   DATA_Len_HTTP=Len-Start_HTTP;  //HTTP包长度
   DATA_Len_TCP=DATA_Len_HTTP+20;  //TCP数据包长度
   IP_PACK_Len=DATA_Len_TCP+20;
   TCP_ISN_A=TCP_ISN_O+Receive_PACK_HTTP_Len;
   TCP_Symbol_Send=0x18;   //ACK  PSH

   HEAD_TCP();
   HEAD_IP();
   HEAD_Ethernet();

   NET_Send_Packet(Send_Buffer,Len);  //发送数据包

   TCP_ISN+=DATA_Len_HTTP;
}

UINT Change_Dec_ASC(UINT Data,UCHAR *ASC)  //将数字转换成ASC码
{
   UINT i,Len=0,Data_n=Data;
   for(i=0;i<10;i++)
   {
      ASC[Len++]=((Data_n%10)+48)&0xff;
      if((Data_n=Data_n/10)==0)
         break;
   }
   return Len;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -