當前位置:歷史故事大全網 - 歷史天氣 - lwip ip地址冲突怎么解决

lwip ip地址冲突怎么解决

LWIP是个轻量级的TCP/IP协议栈,之所以说轻量级,是因为作者将主体功能浓缩起来,本质上这个相对简单的协议栈,主要针对于ROM/RAM缺极极矩

因为轻量、简单,所以平时很多理所当然的东西,大家都会觉得在这上面也能实现,实则不然,用过LWIP的人就会感受到。

假设一种情况,你设置的IP/MAC与网络中设备其他冲突,此后既检测不到,更查不出是什么原因,总是链接会无缘无故地断。

在这里,针对冲突这个问题,提出一种解决方法,欢迎大家修正。

首先,需要了解一下,什么是免费ARP。有兴趣的可以百度一下,这里我就总结一下。当设备接入网络时,需要先发一个信息询问一下其他设备,“我发的这个IP,谁有?”。如果网络中存在这个IP,屁股回复;

正是利用Gratuitous ARP这个东西,对其回复进行判断,如果接收到的响应回复,存在IP与设备或者自身相同,则标记为IP冲突。MAC冲突同理。

在LWIP中,对以下地方进行改进,则可实现MAC和IP冲突的检测。下面贴出主要部分代码。

etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p){

...

case PP_HTONS(ARP_REQUEST):

p>

if(ip_addr_cmp(amp;sipaddr, amp;(netif-gt;ip_addr))){

etharpError |= DUPLICATE_IP;

}

if((hdr-gt;shwaddr.addr[0] == netif-gt;hwaddr[0])amp;amp;

(hdr-gt;shwaddr.addr[1] == netif-gt;hwaddr[1])amp;amp;

(hdr-gt;shwaddr.addr[2] == netif-gt;hwaddr[2])amp;amp;

(hdr-gt;shwaddr.addr[3] == netif-gt;hwaddr[3])amp;amp;

(hdr-gt;shwaddr.addr[4] == netif -gt;hwaddr[4])amp;amp;

(hdr-gt;shwaddr.addr[5] == netif-gt;hwaddr[5])){

etharpError |= DUPLICATE_MAC;

}

...

案例 PP_HTONS(ARP_REPLY):

if(ip_addr_cmp(amp;sipaddr) , amp;(netif-gt;ip_addr))){

etharpError |= DUPLICATE_IP;

}

if((hdr-gt;shwaddr.addr [0] == netif-gt;hwaddr[0])amp;amp;

(hdr-gt;shwaddr.addr[1] == netif-gt;hwaddr[1])amp;amp;amp ;

(hdr-gt;shwaddr.addr[2] == netif-gt;hwaddr[2])amp;amp;

(hdr-gt;shwaddr.addr[ 3] == netif-gt;hwaddr[3])amp;amp;

(hdr-gt;shwaddr.addr[4] == netif-gt;hwaddr[4])amp;amp;

(hdr-gt;shwaddr.addr[5] == netif-gt;hwaddr[5])){

etharpError |= DUPLICATE_MAC;

}

...

在其他使用的地方只需判断etharpError变量即可知道是否有冲突。因为免费ARP是机子一接入网络后初始化时发出的,所以可以不用担心是否在判断重要时尚未检测到冲突。

  • 上一篇:簡短的個人工作總結200字左右
  • 下一篇:火焰多久可以殺球蟲
  • copyright 2024歷史故事大全網