网络部分重要的tcpip init函数是LwIP提供一个API负责完成_第1页
网络部分重要的tcpip init函数是LwIP提供一个API负责完成_第2页
网络部分重要的tcpip init函数是LwIP提供一个API负责完成_第3页
网络部分重要的tcpip init函数是LwIP提供一个API负责完成_第4页
网络部分重要的tcpip init函数是LwIP提供一个API负责完成_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

tcpip_init()LwIPAPITCPIP层的初始化及处理线程的建立工实际上,LwIPIPMAC地址的网络接口,这些接口可以独立处理网络通讯而不互相干扰。LwIP把它们以链表的方如果我们采用函数调用的方式把底层接收函数得到的IP包作为参数传递给ip_input(),那ETH_IRQHandler网络中断函数里面发送消息到这个线程这几行代码完成数据向IPARP表,然后跳过以太网帧头,最后传递给IP协议处理模块,在这里实际上就是把收到的数据交给tcpip_input()函数。申请接收缓冲区――pbuf,然后调用EMACReadPacket()函数把EMAC收到的数据搬运到pbuf中,完成EAMC到协议栈的数据转移工作。pbuf_alloc()poolpbufsUDPUDP话路(session)的状态都被保留在一个PCB7UDPPCBsUDPdatagramUDPPCBUDPPCBPCBUDP话路(session)由IP地址和端来定义,并且被存放local_ip,dest_ip,local_port,dest_port域中。Flags域这一话路(session)UDPUDPchecksummingUDP轻便在哪个检验数字盖住只数据报的部分。ThiscanbeeithertoswitchUDPchecksummingoffcompley,ortouseUDPLite[LDP99]inwhichthechecksumcoversonlypartsofthedatagramIfUDPLiteisused,thechksumlenfieldspecifieshowmuchofthedatagramthatshouldbechecksummed.PCBsessiondatagramrecvrecv_arg将被使datagram时,recv所指向的函数被调用。TCP数据,tcp_write()tcp_write()来函数tcp_output()将检查数据是否可以发送。也就是说,如果的窗口有足够的空间()IPTCPtcp_input()初始检验(,checksummingTCP剖析析)TCP连接。该段于是由tcp_process()处理,它实现TCP状态机和其他任何必须的状态转换。。如果接处于tcp_receivetcp_receive()将把段上传tcp_output()将被调用。Netbufs6.1netbufpbuf之间的内部关联。Netbufs可以当做pbufs容纳分配的内存和的内存。数据在netbuf里面可以是不同大小的碎片块,这意味着应用程序必须准备好接受零碎的数据。netbuf内部有一个指针指向netbuf里面的一个碎片,netbuf_next()和netbuf_first()两个函数就是利用了这个指针。low_level_init函数里面创建了ethernetif_input二、在tcpip_init函数里面创建了tcpip_threadIP部分传递。tcpecho_inittcpecho_thread任务,等待接收数据。四、在tcpecho_init 中有tcpecho_thread->netconn_new(NETCONN_TCP)-> accept_function->setup_tcp(newconntcp_recv(pcb,recv_tcp)->recv_tcp2015611TCP服务器的程序,相比以前来说,移植略微有点繁琐,多了以下几点一、跟原来一样,添加了LwIP的协议。tcp_echo_server的应用程序。三、添加了板级支持包的STM32_EVAL。四、添加了网卡的驱动LIBRARY\STM32F2x7_ETH_Driver。五、自己在port 下面添加了一个关于UCOS-III的文件。IPMACIP地址、掩码地址和网关地址在LwIP_Init函数里面。MAClow_level_init函数里面。好像配置MAC2015615第一、我最开始在两台电脑上面互相发现不同,经过别人的指点,原来是两台脑没有关闭,电脑之间相互互相关闭的。–当前的端口正在使用,如果还有第二个网卡,就不能使用这个端了。别的电脑作为端,配置如原来边工发给我的工程里面,直接操作串口的方式是在kernel\lwip-1.3.0\src\arch 201578—,,面却发现问题不通。一开始不知道怎么查,边工跟我说的时候可以检查一下DMA的数组这个是与底层打交道的数组它在LwIP_Init(false)->netif_add(&main_net, ethernetif_init->BSP_InitEth()->Tx_Buff&Rx_Buff。在stm32f2x7_eth.c文件的68行。,,在正常的时候这里面都可以看到Tx_Buff里面的[0]-[4]都有IP地址信息而在不通的情况之下Rx_Buff里面[0]-[4]IP信息,其它的信息看不出有什么实际的意可以很明显的看到数据的接收出现了问题,对照着从网上的LWIP1.4.0版本仔细看了一下,原来好像是采用中断方式接收数据,而板子例程上面提供的是查询方式,在ETH_IRQHandler时候加上了使能网络中断部分,在stm32f2x7_eth_bsp.c文件的515行加上了ETH_DMAITConfig(ETH_DMA_IT_NIS|ETH_DMA_IT_R,ENABLE);就正常了。二OSDly110秒钟才有一次断点,很明显,是时钟没有设置正确,影响到其它的任务了,于是通过clock查找工程中相三之后的一段时间主要是在网上找资料,找到当年写程序最原始的一本书《Linux网络编14accept客户端,另外一select看看已经有的文件描述符是否有变化,这样的操作效率是最高的。四2015721单步,在tcpip.c文件里面的73行tcpip_thread任务里面,发现了memp_2 ShowCallerCode3到了这一步,就开始找数据有多大,来源是什么,在sockets.c文件里面630行lwip_recvfrom函数里面,发现buflen是0x1E1F,最开始我以为是自己定义的7711BYTE,而在传送正常Linux的时候用到的是Wireshark,但是评论说这个软件用起来比较麻烦,用这个软件IpTool比较好点。于是在网上了这个软件,关45copy的源地址和目标地址,也没有发现什么样的问题。接着我怀疑是不是我这个网络调试助手工具出现了问题,于是我在网上了好几个类似的软件,6201575api_msg.c218recv_tcp函数里面,这个CallStack+Localsrecv_tcpShowCallerCode就到了。7tcp_in.c328行,没有重启运行速度过快导致程序出现了一些,于是我在tcpip_thread这个任务里面加上8文件里面的168行加上一个判断,如果是0x11,则把它修改为0x14,这样就没有任后来我在这里修正了一下,在ethernetif.cpbuf_t*low_level_input(structnetif*netif)函数里面进行了修正。sockets.c380opt.h330行的MEMP_NUM_NETCONN,40次。 应该在tcp_in.c的330 366行的else语句是自己加的tcp_in.c的168行语句是自己加的staticerr_trecv_tcp(void*arg,structtcp_pcb*pcb,structpbuf*p,err_terr)recv_flags&TF_GOT_FINstatictcp_process(structtcp_pcb*pcb)u8u8_trecv_flags;if(p== staticvoid{//sys_sem_signal(&lwip_eth_sem);}if(err!=ERR_ABRT)if(recv_flags&TF_RESET)/*TF_RESETmeansthattheconnectionwasresetbytheotherend.WethencalltheerrorcallbacktoinformtheapplicationthattheconnectionisdeadbeforewedeallocatethePCB.*/tcp_pcb_remove(&tcp_active_pcbs,pcb);}/*IfaFINsegmentwasreceived,wecallthecallbackfunctionwithaNULLbuffertoindicateEOF.*/if(recv_flags&TF_GOT_FIN)/*correctrcv_wndastheapplicationwon'tcalltcp_recved()fortheFIN'sseqno*/if(pcb->rcv_wnd!=TCP_WND){}TCP_EVENT_CLOSED(pcb,err);if(err==ERR_ABRT){goto}}recv120x11这样的指令,经过我的修正之后都是一样的。这里纠30x11,而全速运行4经过查看资料,找到了接收底层数据的函数,在ethernetif.c文件的123行355致程序挂掉呢?那到底是什么原因促使没有及时回复呢?在哪里回复呢?于是我在底层发送的部分,也就是ettic0行l_leelttttetif*net,ttf*p)tcp_in.c451tcp_rst这个部分,条6tcphdr->_hdrlen_rsvd_flags0x19,会有一个回复令,而全速运行的时候tcphdr->_hdrlen_rsvd_flags是0x14,没有回复命令,于是我在这里加上了一个判断,如果是0x14,就把它修改为0x19。其实我至今都不明白为0x190x19肯定是对的。7recv的返回值是负数,而全速运行的时都把conn->last_err设置成为0xF5,也就是重启的指令,而在这里的356行就是错误的5为什么却不执行这里的返回值呢?直接返回状态无错误的状态呢?终于发现问题的关键点22代码本来应先判断统的状态后再数但是这里很显的是没有判系断开的状下直接数据。8*conn,void**new_buf)函数里面确实是先判断状态,然后数据,但是数据是采用pend等待数据,也就是确认之前的状态没有问题了才数据,它并没有对后的数据9 conn->last_err=err=conn-/*don'trecvonfatalerrors:thismightblocktheapplicationtaskwaitingonrecvmboxforever!*//*@todo:thisdoesnotallowustofet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论