|
之前在51上搞好了UDP協(xié)議棧,現(xiàn)在挪到ARM上用,本想著會(huì)一帆風(fēng)順,結(jié)果卻是荊棘密布,花了一天工夫終于搞完了核心程序的移植,問(wèn)題不是出在高層而是出在底層,硬件的接口,ARM速度高,接口我把分頻改成最大,最大降低速度,但是還是很不穩(wěn)定,很容易死!后來(lái)發(fā)現(xiàn)進(jìn)行短暫的延時(shí)有效,而且很穩(wěn)定,我想可能是速度太快了,硬件沒(méi)有時(shí)間反應(yīng)的緣故吧總之,是搞定了,哈哈,在51上的網(wǎng)卡接口只能是控制個(gè)小玩意,移到ARM上是我好久的夢(mèng)想,也是用它傳輸攝像頭的圖片的開始,加油吧!拍照然后回傳電腦才是我的最終目的!
經(jīng)過(guò)幾天的調(diào)試終于可以實(shí)現(xiàn)TCP的連接了,其實(shí)跟UDP很相似只是他有個(gè)應(yīng)答機(jī)制,就是所謂的三次握手,這三次握手都是在我程序的控制下進(jìn)行的,對(duì)我來(lái)說(shuō)已經(jīng)很透明,這就是自己寫協(xié)議棧的好處吧!可已學(xué)到不少東西,就是很麻煩,TCP的實(shí)現(xiàn)遠(yuǎn)沒(méi)有那么簡(jiǎn)單,還有很多東西要寫,比如重發(fā)機(jī)制和四個(gè)定時(shí)器,還有避免報(bào)文的分片,以及現(xiàn)在都搞不懂的操作字,這個(gè)操作字在協(xié)議手冊(cè)中沒(méi)有提到,但是在實(shí)際中卻是關(guān)鍵,所以要學(xué)的東西真是太多了而這僅僅是個(gè)開始,隨著程序的增大我越來(lái)越感覺(jué)到我的結(jié)構(gòu)化有問(wèn)題,雖然一經(jīng)采用了多文件處理,但是還是顯得有點(diǎn)無(wú)序,哎,總之,這是自己的成果,還是很高興的!!
- #include "ARP.h"
- #include "IP.H"
- #include "UDP.H"
- #include "TCP.H"
- /*對(duì)內(nèi)部FIFO的操作*/
- #include "ENC28J60_Buff_Operation.h"
- #include "ENC28J60_Receive.h"
- #include "ENC28J60_SPI.h"
- #include "UART.H"
- #include "ENC28J60_Send_Receive.h"
- static xdata uchar flage=0;//釋放FIFO的上部分還是下半部分FLAGE=0,釋放下半部分FLAGE=1釋放上半部分
- static xdata uchar ARP_REQUEST=0;//ARP請(qǐng)求獲取網(wǎng)關(guān)標(biāo)志位,0表示可以進(jìn)行ARP請(qǐng)求,1表示已經(jīng)獲得MAC地址可以關(guān)閉ARP
- static xdata uint Receive_Next_Add_Pointer;//下個(gè)數(shù)據(jù)包的開始地址指針
- static xdata uint Receive_Now_Add_Pointer;//當(dāng)前地址指針
- static xdata uint Receive_MAC_Type;//數(shù)據(jù)包的類型
- static xdata uint Receive_Size_Packet;//數(shù)據(jù)包的大小
- static xdata uint Receive_Add_Pointer_MSB=0;
- static xdata uint Receive_Add_Pointer_LSB=0;
- static xdata uint Receive_MAC_Type_MSB; /*接收數(shù)據(jù)包的臨時(shí)地址指針緩沖區(qū)*/
- static xdata uint Receive_MAC_Type_LSB;
- static xdata uint Receive_ARP_Type_MSB;
- static xdata uint Receive_ARP_Type_LSB;
- static xdata uint Receive_ARP_Type;
- static xdata uchar Receive_Data[20];//接收到的UDP數(shù)據(jù)
-
- /*UDP相關(guān)設(shè)置*/
- ////////////////////////very important config//////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////very important config///////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////very important config//////////////////////////////////////////////////////////////////////
- static xdata uchar MAC_Target_add[6];//網(wǎng)關(guān)目標(biāo)MAC這個(gè)由ARP自動(dòng)獲取
- static xdata uchar IP_Target_add[4]={192,168,1,89};//外網(wǎng)或者內(nèi)網(wǎng)的IP地址
- static xdata uchar UDP_Source_Port[2]={0x0b,0xd1}; //udp本機(jī)IP 3025
- static xdata uchar UDP_Target_Port[2]={0x1f,0x41}; //對(duì)方端口 8001
- static xdata uchar UDP_Send_Data[]={0x56,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa};//發(fā)送的數(shù)據(jù)
-
- /* xdata uchar TCP_Source_Port[4];
- xdata uchar TCP_Target_Port[4];
- xdata uchar TCP_Send_Data[10];
- xdata uchar TCP_Send_Data_length;
- */
- xdata uint UDP_Source_Port_C=8001;//對(duì)方端口
- xdata uint UDP_Target_Port_C=3025;//本地端口
- xdata uchar Send_ARP_Frame_sender_IP[4]={192,168,1,114};//本機(jī)IP
- xdata uchar Send_ARP_Frame_Target_IP[4]={192,168,1,1};//網(wǎng)關(guān)IP
- xdata uint n=0;
- //////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////very important config////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////
- //TCP端口
- static xdata uchar TCP_Source_Port[2]={0x04,0xee};//本機(jī)IP 1262
- static xdata uchar TCP_Target_Port[2]={0x1f,0x41};//對(duì)方端口 8001
- static xdata uchar TCP_Sequence_Number_Send[4]={0xcc,0x0a,0x68,0x75};//發(fā)送端序列號(hào)
- static xdata uchar TCP_Sequence_Number_Receive[4];//接收端回復(fù)的序列號(hào)
- static xdata uchar TCP_Send_Data[]={0x02,0x04,0x05,0xb4,0x01,0x01,0x04,0x02,0x01,0x01,0x04,0x02};//發(fā)送的數(shù)據(jù)
- xdata uint TCP_Source_Port_C=8001;//對(duì)方端口
- xdata uint TCP_Target_Port_C=1262;//本地端口
- //xdata uint IP_Receive_Send_check_Sum[10];//用于校驗(yàn)和計(jì)算的數(shù)組
- //xdata uint IP_CHECK_MUNB;//計(jì)算后的IP部首的校驗(yàn)和被寫入這里面
- /*****************************
-
-
- 接收數(shù)據(jù)包
-
- 45頁(yè)
- *******************************/
- void Receiving_data_packet()
- { uchar xdata d2;
- /*用于ARP請(qǐng)求*/
-
- Receive_Next_Add_Pointer=0;//緩沖區(qū)的數(shù)據(jù)包下一個(gè)地址指針. 初始化
- Receive_Now_Add_Pointer=0x300;//當(dāng)前數(shù)據(jù)緩沖區(qū)地址指針.
-
-
-
- ///檢測(cè)EPKTCNT是否為空
-
- while(1) //死在里面么,這個(gè)是故意的
- {
- write_ENC28J60_REG_SPI(ECON1,5);//開啟接收
- for(;;)
- {
- d2=read_ENC28J60_REG_SPI(EPKTCNT);//有無(wú)數(shù)據(jù)報(bào)?
- // SendOneByte(d2);
- if(d2>0)break;
- }
- //
- //delay1s();
- /*ARP請(qǐng)求,注意這個(gè)ARP請(qǐng)求是獲取指定網(wǎng)關(guān)的IP,也就是192.168.1.1*/
- //
- READ_N_Packet();//讀數(shù)據(jù)包
- if(ARP_REQUEST==0) //是否獲取MAC?沒(méi)有?好進(jìn)入獲取MAC地址,這是個(gè)ARP請(qǐng)求
- {
- Send_ARP_Request_packet(Send_ARP_Frame_sender_IP,Send_ARP_Frame_Target_IP);
-
- }
- if(ARP_REQUEST==1)
- {
-
- /*TCP鏈接請(qǐng)求*/
- Send_TCP_Establish_Connection( &MAC_Target_add,
- &IP_Target_add,
- &TCP_Source_Port,
- &TCP_Target_Port,
- &TCP_Sequence_Number_Send,
- &TCP_Sequence_Number_Receive,
- 2,
- &TCP_Send_Data,
- 8
- );
- ARP_REQUEST=0x88;//只發(fā)一次連接請(qǐng)求然后等待回應(yīng)
- }
-
-
-
-
-
-
-
-
-
-
-
- Check_The_remaining_space();//檢查是否釋放緩沖區(qū)
- write_ENC28J60_REG_SPI(ECON2,0x40);//PACKET減一
-
-
- }
- }
- /*******************************
-
- 檢查剩余空間,如果不夠就釋放空間
- 是這樣的流程:
- 首先解釋ERXRDPTL和ERXRDPTH這個(gè)寄存器是干什么的呢?他就是說(shuō)硬件通過(guò)ERXWRPTL和ERXWRPTH寫入指定的緩存
- 那么他在那里停止呢?緩存器的底部?錯(cuò),這個(gè)接收緩沖區(qū)就是一個(gè)FIFO,他是循環(huán)的存儲(chǔ)結(jié)構(gòu),所以他在到底部
- 時(shí)不會(huì)停會(huì)跳到開始字節(jié)繼續(xù),那么這樣一來(lái)他不就停不下了嗎?顯然芯片設(shè)計(jì)的人不允許他這樣所以設(shè)置了這個(gè)
- 寄存器ERXRDPTL和ERXRDPTH,他就是停止一旦硬件寫到他的地址以后的數(shù)據(jù)他不在接收,全部丟棄,所以要想全部
- 一個(gè)包不少的把以太網(wǎng)上的數(shù)據(jù)接收回來(lái)就要周期性的更新這個(gè)地址,也就是說(shuō)他需要程序自己控制而不要干涉他
- 否則你將不會(huì)得到連續(xù)的數(shù)據(jù)包,我程序里這樣設(shè)計(jì)的:首先在初始化設(shè)定接收緩存的開始地址和結(jié)束地址分別是
- 從0x300-0x1fff這7KB的區(qū)域全部是接收緩沖區(qū)(FIFO),初始化后ERXWRPTL和ERXWRPTH這個(gè)指針自動(dòng)更新對(duì)準(zhǔn)0X300
- 這個(gè)寫指針是硬件控制的,用戶控制不了,所以呢不用管,只要在乎這個(gè)ERXRDPTL和ERXRDPTH地址指針,這個(gè)指針我首先
- 付給他一個(gè)地址0x0e7e,也就是差不多在這個(gè)FIFO的一半的位置什么意思呢?表示如果我不更新這個(gè)指針的話那么硬件從0X300寫到
- 0X0E7E就不在寫了,所以我要一邊讀下一個(gè)包的地址一邊計(jì)算他逼近的距離,當(dāng)小與400個(gè)字節(jié)的時(shí)候就把這個(gè)指針向下移動(dòng)到0X1FFF
- 也就是FIFO的底部,這時(shí)候硬件就可以繼續(xù)向下,但是這時(shí)如果不更新這個(gè)指針,他就在0X1FFF的時(shí)候有就停止了,所以采取同樣的辦法
- 就是計(jì)算逼近距離小于400字節(jié)就更新指針到原來(lái)的位置0X0E7E,他又可以繼續(xù)寫了,就這樣有數(shù)據(jù)包就收數(shù)據(jù)包永遠(yuǎn)追不上指針,就像小時(shí)候
- 玩的一個(gè)游戲一個(gè)棍兩頭各一個(gè)動(dòng)物轉(zhuǎn)動(dòng)他們他們永遠(yuǎn)不相遇,就是這個(gè)道理,至于處理數(shù)據(jù)包這個(gè)就被抽象出來(lái)了,你想怎么處理就怎么處理
- 2011年11月23日
- 無(wú)錫第五項(xiàng)目部
- 王均偉
-
- ******************************/
-
- /***********************
-
- 檢查是否釋放緩沖區(qū)函數(shù)
- 這個(gè)函數(shù)就是要不斷的檢查接收緩
- 存數(shù)據(jù)是不是達(dá)到臨界指針,到了
- 就要馬上讓指針下移以免數(shù)據(jù)重疊。
- *************************/ /**************************/
- void Check_The_remaining_space() //讀取當(dāng)前終止指針的值
- { uint xdata m,l,d,d2; /**************************/
-
- l=read_ENC28J60_REG_SPI(ERXRDPTL);
- m=read_ENC28J60_REG_SPI(ERXRDPTH);
- d2=((l&0x00ff)+((m<<8)&0xff00)); /*****************************/
- d=d2-Receive_Next_Add_Pointer; // 下一個(gè)數(shù)據(jù)包的地址和當(dāng)前終止地址作比較
- //看看是否接近到離終止指針400個(gè)字節(jié)的地方?
- //還有這個(gè)Flage表示以0X0E7E為界的緩存的釋放,
- //FLAGE=0表示釋放下半部分FIFO(0x0e7e-0x1fff)
- //FLAGE=1表示釋放上半部分FIFO(0X1FFF-0X0E7E)
- /***************************/
- if((d<250)&(flage==0))//如果flage=0和
- {
- write_ENC28J60_REG_SPI(ERXRDPTL,0xff);
- write_ENC28J60_REG_SPI(ERXRDPTH,0x1f);
- flage=1;
- }
- else
- if((d<250)&(flage==1))//如果flage=1和空間不足
- {
- write_ENC28J60_REG_SPI(ERXRDPTL,0x7e);
- write_ENC28J60_REG_SPI(ERXRDPTH,0x0e);
- flage=0;
-
- }
- }
-
- /************************************************
- 讀取數(shù)據(jù)包和處理將在這里進(jìn)行
- 主要是從BUFF里取出數(shù)據(jù)包并且處理,比如ARP、UDP、的數(shù)據(jù)提取和回應(yīng)啥的
- ************************************************/
-
- void READ_N_Packet()
- {
- /***********************數(shù)據(jù)處理開始*********************************************/
- xdata uchar i; //定義一個(gè)計(jì)數(shù)變量好用來(lái)接收數(shù)據(jù)
-
- xdata uint k; //計(jì)數(shù)
- /*定義接收到的包相關(guān)信息
- 比如MAC、源地址IP。目標(biāo)IP啥的
- 用來(lái)判斷是否需要ARP應(yīng)答
- */
- xdata uchar Receive_MAC_Source_add_MAC[6];
- xdata uchar Receive_ARP_Frame_sender_IP[4];
- xdata uchar Receive_ARP_Frame_Target_IP[4];
- xdata uchar Receive_IP_Frame_Type;//定義IP協(xié)議類型
-
- xdata uchar Receive_Source_Port_MSB;
- xdata uchar Receive_Source_Port_LSB;
- xdata uchar Receive_Destination_MSB;
- xdata uchar Receive_Destination_LSB;
- xdata uint Receive_Destination;
- xdata uint Receive_Source_Port;
- xdata uchar Receive_Length_MSB;
- xdata uchar Receive_Length_LSB;
- xdata uint Receive_Length;//UDP數(shù)據(jù)長(zhǎng)度
- xdata uchar TCP_FLAGES;//TCP標(biāo)志位
- // xdata uint IP_Chrck_sum_MSB;
- // xdata uint IP_Chrck_sum_LSB;
-
- //這都是從接收的數(shù)據(jù)包檢索出的數(shù)據(jù),讀出來(lái)存變量*/
- /**這里解釋一下read_buffer_add(Receive_Now_Add_Pointer+18)為什么是18,
- 首先抓包后的數(shù)據(jù)內(nèi)個(gè)MAC層的類型位置在12字節(jié)上,而這里要注意,ENC28J60內(nèi)部
- 是有個(gè)緩存他要先把下一數(shù)據(jù)包的存放地址寫進(jìn)去,占兩個(gè)字節(jié),然后是4個(gè)字節(jié)的
- 狀態(tài)字,加起來(lái)是6個(gè)字節(jié),所以要在ENC28J60的接收緩存中找到MAC幀類型就得要加上6
- 所以這里是18,注意是ENC28J60,不是PC,詳細(xì)應(yīng)該看手冊(cè)的45頁(yè)!!!!!
- 2012年3月1日
- 于日照高科園
- 王均偉
- **/
- Receive_MAC_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+18); /***讀取數(shù)據(jù)包的類型*****/
- Receive_MAC_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+19);
- Receive_MAC_Type=( ((Receive_MAC_Type_MSB<<8)&0xff00)+(Receive_MAC_Type_LSB&0x00ff));
-
- Receive_IP_Frame_Type=read_buffer_add(Receive_Now_Add_Pointer+29);//讀取IP部首的協(xié)議
- Receive_Add_Pointer_MSB=read_buffer_add(Receive_Now_Add_Pointer+1);
- Receive_Add_Pointer_LSB=read_buffer_add(Receive_Now_Add_Pointer);
- Receive_Next_Add_Pointer=(((Receive_Add_Pointer_MSB<<8)&0xff00)+(Receive_Add_Pointer_LSB&0x00ff)); //計(jì)算下一個(gè)數(shù)據(jù)包的地址
- Receive_ARP_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+26); /***讀取數(shù)據(jù)包的操作*****/
- Receive_ARP_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+27);
- Receive_ARP_Type=( ((Receive_ARP_Type_MSB<<8)&0xff00)+(Receive_ARP_Type_LSB&0x00ff));
-
- Receive_Size_Packet=(Receive_Next_Add_Pointer-Receive_Now_Add_Pointer);//計(jì)算接收到的這個(gè)數(shù)據(jù)包的大小
-
- /*************************************
- 如果是ARP請(qǐng)求就應(yīng)答
- ***************************************/
-
- if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0001))//檢索ARP請(qǐng)求,回應(yīng)
- {
-
-
-
-
-
- Receive_MAC_Source_add_MAC[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
- Receive_MAC_Source_add_MAC[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
- Receive_MAC_Source_add_MAC[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
- Receive_MAC_Source_add_MAC[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //發(fā)送者M(jìn)AC
- Receive_MAC_Source_add_MAC[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
- Receive_MAC_Source_add_MAC[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
-
-
-
- Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
- Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35); //發(fā)送者IP
- Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
- Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
-
- Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
- Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+45); //目標(biāo)IP
- Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
- Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
-
- /***************************
- 如果IP地址是本機(jī)
- ******************************/
- if((Receive_ARP_Frame_Target_IP[0]==Send_ARP_Frame_sender_IP[0])&
- (Receive_ARP_Frame_Target_IP[1]==Send_ARP_Frame_sender_IP[1])&
- (Receive_ARP_Frame_Target_IP[2]==Send_ARP_Frame_sender_IP[2]) &
- (Receive_ARP_Frame_Target_IP[3]==Send_ARP_Frame_sender_IP[3]))
- {
-
-
-
-
- /*ARP 發(fā)送一幀數(shù)據(jù)應(yīng)答*/
-
- Send_ARP_Answer_packet( Receive_MAC_Source_add_MAC,Receive_ARP_Frame_sender_IP,Receive_ARP_Frame_Target_IP); //應(yīng)答
-
-
-
- }
-
- }
-
- else
- /*************************************
- 如果是ARP應(yīng)答那么接收MAC
- ***************************************/
- /*檢索ARP應(yīng)答,提取目標(biāo)MAC*/
- if((Receive_MAC_Type==0x0806)&&(Receive_ARP_Type==0x0002))//檢索ARP回應(yīng)
- {
-
- P0=0x0f;
-
- Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
- Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35); //發(fā)送者IP
- Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
- Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
- //是發(fā)來(lái)的應(yīng)答就提取MAC
-
- if( (Receive_ARP_Frame_sender_IP[0]==Send_ARP_Frame_Target_IP[0])
- &&(Receive_ARP_Frame_sender_IP[1]==Send_ARP_Frame_Target_IP[1])
- &&(Receive_ARP_Frame_sender_IP[2]==Send_ARP_Frame_Target_IP[2])
- &&(Receive_ARP_Frame_sender_IP[3]==Send_ARP_Frame_Target_IP[3])
- )
- {
-
- MAC_Target_add[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
- MAC_Target_add[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
- MAC_Target_add[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
- MAC_Target_add[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //提取發(fā)送者M(jìn)AC
- MAC_Target_add[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
- MAC_Target_add[5]=read_buffer_add(Receive_Now_Add_Pointer+17);
- ARP_REQUEST=1;//停止ARP請(qǐng)求
-
- }
-
-
- }
- else
-
- /******************************************************************************
- 如果不是ARP檢查是不是UDP是就接收數(shù)據(jù)
- *********************************************************************************/
- if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x11))//檢索UDP數(shù)據(jù),接收
- {
- /*這個(gè)地方用的上滿ARP的變量由于是局部變量所以
- 可以用,只是用它作為中間量獲取IP,工判斷用
- 無(wú)實(shí)際意義*/
-
- // if(IP_CHECK_MUNB==0)
- // {
- Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
- Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33); //獲得發(fā)送者IP
- Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
- Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
-
- Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
- Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37); //獲得目標(biāo)IP
- Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
- Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
-
-
-
- Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
- Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
- Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
-
- Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
- Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目標(biāo)端口
- Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
-
-
- //數(shù)據(jù)長(zhǎng)度
-
- /*如果是目標(biāo)發(fā)來(lái)*/
- if((Receive_ARP_Frame_Target_IP[0]==IP_Target_add[0])
- &&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])
- &&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
- &&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
-
- )
- {
- /*如果是8080端口發(fā)到8080的發(fā)來(lái)到本機(jī)8080的數(shù)據(jù)接收*/
- if( (Receive_Source_Port== UDP_Source_Port_C)
- &&(Receive_Destination==UDP_Target_Port_C)
- )
- {
-
-
-
-
- /*計(jì)算接收到的數(shù)據(jù)字節(jié)*/
- Receive_Length_MSB=read_buffer_add(Receive_Now_Add_Pointer+44); //
- Receive_Length_LSB=read_buffer_add(Receive_Now_Add_Pointer+45); //
- Receive_Length=((((Receive_Length_MSB<<8)&0xff00)+(Receive_Length_LSB&0x00ff))-8);
- /*讀取數(shù)據(jù)字節(jié)最大20個(gè)字節(jié)*/
- for(i=0;i<Receive_Length;i++)
- {
- /*讀數(shù)據(jù)存數(shù)組數(shù)據(jù)長(zhǎng)度不可以超過(guò)長(zhǎng)度*/
- Receive_Data[i]=read_buffer_add(Receive_Now_Add_Pointer+48+i);
-
- }
-
- if(Receive_Data[0]==0x0f)
- {
-
- Receive_Data[1]++; //接收到有效數(shù)據(jù)后自動(dòng)加1
- UDP_Send_Data[0]=Receive_Data[1];//接收的數(shù)據(jù)加載到發(fā)送緩沖區(qū)
- Send_UDP_packet( MAC_Target_add,
- IP_Target_add,
- UDP_Source_Port,
- UDP_Target_Port,
- UDP_Send_Data,
- 1
-
- );
-
- }
-
-
-
-
- }
-
-
-
-
-
- }
-
-
-
-
-
- }
- else
- /******************************************************************************
- 如果是TCP數(shù)據(jù)那么接收!
- *********************************************************************************/
- if((Receive_MAC_Type==0x0800)&&(Receive_IP_Frame_Type==0x06))//檢索TCP數(shù)據(jù),接收
- {
- /* for (k=0;k<Receive_Size_Packet;k++)
- {
-
- SendOneByte(read_buffer_add(Receive_Now_Add_Pointer+k));
-
- } */
-
- /* 獲得發(fā)送者IP */
- Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
- Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33); //獲得發(fā)送者IP
- Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
- Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
- /* 獲得目標(biāo)IP */
- Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
- Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37); //獲得目標(biāo)IP
- Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
- Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);
-
-
-
- Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
- Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
- SendOneByte(Receive_Source_Port_MSB);
- SendOneByte(Receive_Source_Port_LSB);
- Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
-
- Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
- Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目標(biāo)端口
- SendOneByte(Receive_Destination_MSB);
- SendOneByte(Receive_Destination_LSB);
- Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
-
-
- /*讀取TCP得標(biāo)志位FLAGES*/
- TCP_FLAGES=read_buffer_add(Receive_Now_Add_Pointer+53);
- SendOneByte(TCP_FLAGES);
- /*接收發(fā)送來(lái)的序列號(hào)*/
- TCP_Sequence_Number_Send[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
- TCP_Sequence_Number_Send[1]=read_buffer_add(Receive_Now_Add_Pointer+45);
- TCP_Sequence_Number_Send[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
- TCP_Sequence_Number_Send[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
- TCP_Sequence_Number_Send[3]++;
- /*接收應(yīng)答的序列號(hào)*/
- TCP_Sequence_Number_Receive[0]=read_buffer_add(Receive_Now_Add_Pointer+48);
- TCP_Sequence_Number_Receive[1]=read_buffer_add(Receive_Now_Add_Pointer+49);
- TCP_Sequence_Number_Receive[2]=read_buffer_add(Receive_Now_Add_Pointer+50);
- TCP_Sequence_Number_Receive[3]=read_buffer_add(Receive_Now_Add_Pointer+51);
- SendOneByte(Receive_ARP_Frame_sender_IP[0]);
- SendOneByte(Receive_ARP_Frame_sender_IP[1]);
- SendOneByte(Receive_ARP_Frame_sender_IP[2]);
- SendOneByte(Receive_ARP_Frame_sender_IP[3]);
- /*如果是目標(biāo)發(fā)來(lái)*/
- if((Receive_ARP_Frame_sender_IP[0]==IP_Target_add[0])
- &&(Receive_ARP_Frame_sender_IP[1]==IP_Target_add[1])
- &&(Receive_ARP_Frame_sender_IP[2]==IP_Target_add[2])
- &&(Receive_ARP_Frame_sender_IP[3]==IP_Target_add[3])
-
- )
- {
- /*如果是8080端口發(fā)到8080的發(fā)來(lái)到本機(jī)8080的數(shù)據(jù)接收*/
- if( (Receive_Source_Port==TCP_Source_Port_C)
- &&(Receive_Destination==TCP_Target_Port_C)
- )
- {
- /*s是連接回復(fù)!就發(fā)送第三次握手*/
- if(TCP_FLAGES==0x12)
- {
-
-
- Send_TCP_Establish_Connection( &MAC_Target_add,
- &IP_Target_add,
- &TCP_Source_Port,
- &TCP_Target_Port,
- &TCP_Sequence_Number_Receive,
- &TCP_Sequence_Number_Send,
- 0x10,
- &TCP_Send_Data,
- 8
- ) ;
-
-
- }
-
-
- }
-
-
- }
-
-
-
-
-
- }
- /***********************數(shù)據(jù)處理結(jié)束*********************************************/
-
- Receive_Now_Add_Pointer=Receive_Next_Add_Pointer;//下一個(gè)數(shù)據(jù)包地址指針重裝如
-
-
- }
復(fù)制代碼
|
|