STM32以太网程序解析二
2018-03-06 16:27阅读:
TCP/IP/ARP/ICMP首部分析
STM32以太网程序解析一
STM32以太网程序解析二
STM32以太网程序解析三
STM32以太网程序解析四
---------------------------------------------------------------------------------------------------------------------------
下面我们来详细看一下程序,我们将逐行的进行分析。
1. int
simple_server(void)
2. {
3.
unsigned
int
plen,dat_p,i1=0,payloadlen=0;
4.
unsigned
char i=0,*buf1
= 0;
5.
signed
char cmd;
6.
7.
//
将自己设定的mac,ip,wwwport赋值给系统变量
8.
init_ip_arp_udp_tcp(mymac,myip,mywwwport);
9.
10.
printf('\r神舟III号MAC地址:0x%x,0x%x,0x%x,0x%x,0x%x,0x%x',mymac[0],mymac[1],mymac[2],mymac[3],mymac[4],mymac[5]);
11.
printf('\r
IP地址:%d.%d.%d.%d',myip[0],myip[1],myip[2],myip[3]);
12.
printf('\r
端口号:%d\r\r',mywwwport);
13.
14.
while(1)
15.
{
16.
// 判断是否有接收到有效的包
,ETH包,不包含校验CRC
17.
plen
= enc28j60PacketReceive(BUFFER_SIZE, buf);
18.
//
如果收到有效的包,plen将为非0值。
19.
if(plen==0)
20.
{
21.
//
没有收到有效的包就退出重新检测
22.
continue;
23.
}
24.
25.
//
查询ETH包头的类型/长度字节,如果收到目的地址为本机IP的ARP包,则发送一个ARP应答包
26.
if(eth_type_is_arp_and_my_ip(buf,plen))
27.
{
28.
//
如果是返回ARP包
29.
make_arp_answer_from_request(buf);
30.
continue;
31.
}
32.
33.
//
如果接收的目的地址不是本机IP的合法IP包,则重新检测
34.
if(eth_type_is_ip_and_my_ip(buf,plen)==0)
35.
{
36.
//
没有收到有效的包就退出重新检测
37.
continue;
38.
}
39.
40.
// 如果收到ICMP包,并且是ICMP回射请求包
,则发送一个ICMP回射应答包(判断两个终端之间是否有效连接)
41.
if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V
&& buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V)
42.
{
43.
printf('\r收到主机[%d.%d.%d.%d]发送的ICMP包',buf[ETH_ARP_SRC_IP_P]
44.
,buf[ETH_ARP_SRC_IP_P+1]
45.
,buf[ETH_ARP_SRC_IP_P+2]
46.
,buf[ETH_ARP_SRC_IP_P+3]);
47.
make_echo_reply_from_request(buf,
plen);
48.
continue;
49.
}
50.