如何设置k60-k64开发板 enet-2lwip 他的tcp服务器的ip地址

如何设置k60-k64开发板 enet-2lwip 他的tcp服务器的ip地址,第1张

1、右键单击“网上邻居”选择“属性”,打开网络连接属性。

2、在右侧的“网络任务”栏中点击“创建一个新的连接。

3、打开新建连接向导,点“下一步”。在

“网络连接属性”选择里,点击“设置高级连接”,点击“下一步”,然后,在接下来的“高级连接选项”中选择“接受传入的连接”。点击“下一步”。勾寻直接并行(LPT1),点击“下一步”。

4、勾寻允许虚拟专用连接”,点“下一步”。

5、创建一个允许连接的用户权限。点击“添加”按钮,输入双鱼IP转换器账户和密码后点“确定”。点击“下一步”继续。

6、在“网络软件”中勾选需要用到的协议,一般保持默认即可。点击“下一步”后,服务器就搭建完成了。

选择“开始”→“设置”→“控制面板”→“网络连接”→“创建一个新的连接”→“下一步”→“连接到我的工作场所的网络”→“下一步”→“虚拟专用网络连接”,按说明完成后面的 *** 作即可。

LWIP是个轻量级的TCP/IP协议栈,之所以说轻量级,是因为作者将主体功能浓缩起来,做成这相对简单的协议栈,主要针对于ROM/RAM极缺极珍贵的环境下使用。

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

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

在这里,针对冲突这问题,提出一种解决方法,欢迎切磋纠正。

首先,需要了解一下,什么是Gratuitous 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):

if(ip_addr_cmp(&sipaddr, &(netif->ip_addr))){

etharpError |= DUPLICATE_IP

}

if((hdr->shwaddr.addr[0] == netif->hwaddr[0])&&

(hdr->shwaddr.addr[1] == netif->hwaddr[1])&&

(hdr->shwaddr.addr[2] == netif->hwaddr[2])&&

(hdr->shwaddr.addr[3] == netif->hwaddr[3])&&

(hdr->shwaddr.addr[4] == netif->hwaddr[4])&&

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

etharpError |= DUPLICATE_MAC

}

...

case PP_HTONS(ARP_REPLY):

if(ip_addr_cmp(&sipaddr, &(netif->ip_addr))){

etharpError |= DUPLICATE_IP

}

if((hdr->shwaddr.addr[0] == netif->hwaddr[0])&&

(hdr->shwaddr.addr[1] == netif->hwaddr[1])&&

(hdr->shwaddr.addr[2] == netif->hwaddr[2])&&

(hdr->shwaddr.addr[3] == netif->hwaddr[3])&&

(hdr->shwaddr.addr[4] == netif->hwaddr[4])&&

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

etharpError |= DUPLICATE_MAC

}

...

在其它使用的地方只需判断etharpError 这个变量即可知道是否有冲突。因为Gratuitous ARP是机子一接入网络后初始化时发出的,所以可以不用担心是否在判断变量时还没检测到冲突。

原始版本的lwip忘光了,提供我修改的,希望有帮助/*线程空间池*/typedefstructtagNETTHREAD{BOOLstate//状态intprio//任务prioOS_STKthreadStk[NET_THREAD_STK_LEN]//堆栈空间}NETTHREAD,*PNETTHREAD/*初始化线程空间*/staticBOOLThreadSpaceInit(void){intiif((NET_THREAD_MAX_NUM+8+1)>OS_MAX_TASKS){//线程任务最大数目超过OS_MAX_TASKSreturnFALSE}for(i=0iserver,s,&NetThreads.threadStk[NET_THREAD_STK_LEN-1],NetThreads.prio)){return(int)&NetThreads//返回线程id,必须在socket里面在添加一个域用来保存}NetThreads.state=THREAD_SPACE_STATE_FREE}else{OS_EXIT_CRITICAL()}}returnERROR}/*销毁一个线程*/voidNetThreadDel(void*s){PNETTHREADpt//根据socket得到线程id(pt),//线程空间的state要设置为delpt->state=THREAD_SPACE_STATE_DELING//在根据次id得到线程任务prio,删除任务OSTaskDel(pt->prio)}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7805951.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存