lwip udp client程序tcp 跟udp可以共存吗

查看: 35090|回复: 23
stm32+lwip作为tcp客户端无法连接到服务器!!!
主题帖子精华
新手上路, 积分 25, 距离下一级还需 25 积分
在线时间0 小时
我的stm32107+lwip作为tcp服务器端可以跟pc客户端正常通信,而如果作为tcp客户端则无法连接到pc服务器。这是哪里出了问题啊?希望有这方面经验的指导一下小弟,先谢谢了!
代码如下:
#include "lwip/tcp.h"
#include "lwip/ip_addr.h"
#include &string.h&
#define GREETING "Hello. \r\n"
#define HELLO "Hello "
#define MAX_NAME_SIZE 32
struct name
& char bytes[MAX_NAME_SIZE];
void tcp_client_init(void);
err_t tcp_client_connect(void *arg, struct tcp_pcb *pcb, err_t err);
static void tcpaa_conn_err(void *arg, err_t err);
static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
&tcp_write(pcb, GREETING, strlen(GREETING), 1);
& &return ERR_OK;
void tcp_client_init(void)
& &struct tcp_pcb *pcb=NULL;
&& IP4_ADDR(&client_addr, 192, 168, 0, 192);&
&& IP4_ADDR(&server_addr, 192, 168, 0, 32);
& &/* Create a new TCP control block& */
& &pcb = tcp_new();
&if(pcb!=NULL)
& &&/* Assign to the new pcb a local IP address and a port number */
& &&tcp_bind(pcb, &client_addr, 1010);//客户端端口号为33
&&& //注册连接出错处理函数
&&& tcp_err(pcb, tcpaa_conn_err); //hrz
&&& tcp_recv(pcb, tcpaa_recv);//接收到数据的回调函数设置
& &&/* Connect to the server: send the SYN */
& &&ret=tcp_connect(pcb, &server_addr, 1010, tcp_client_connect);//服务器端口号为25
&}&&&&&&&&&&
err_t tcp_client_connect(void *arg, struct tcp_pcb *pcb, err_t err)
&tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));
&tcp_recv(pcb, tcpaa_recv);//接收到数据的回调函数设置
&tcp_write(pcb, GREETING, strlen(GREETING), 1);
& &return ERR_OK;
static void tcpaa_conn_err(void *arg, err_t err)
& struct name *
& name = (struct name *)
& mem_free(name);
& while(1);
主题帖子精华
中级会员, 积分 259, 距离下一级还需 241 积分
在线时间10 小时
void TCP_Client_Init()
&&struct tcp_pcb *C
&&struct ip_
& & & & struct ip_& && && &&&//目标机IP&&
& & & & static unsig& && & //目标机端口号&&
& & & & serverip.addr = htonl(0xC0A8019A);& && & //192.168.1.154
& & & & serverport=20002;&&
& & & & Clipcb = tcp_new();& && && && && && && &&&// 建立通信的TCP控制块(Clipcb)
& & & & tcp_bind(Clipcb,IP_ADDR_ANY,20002);& && & // 绑定本地IP地址和端口号
& & & & iris_pcb=C&&//the mathod is wrong //by iris
& & & & //tcp_recv
& & & & ret= tcp_connect(Clipcb,&serverip,20002,TcpCli_Connected_callback);
& &tcp_recv(iris_pcb,tcp_recv_fn recv);
& & & & if(ret==ERR_OK)
& & & & Debugout(0,&connect oko tcp&);
& & & & //tcp_recv(iris_pcb,TcpCli_Received_callback);
主题帖子精华
金钱102056
在线时间599 小时
主题帖子精华
高级会员, 积分 691, 距离下一级还需 309 积分
在线时间30 小时
全世界的STM32范例都只做到服务端(Server),因为大家都抄来抄去所以就没有啦
主题帖子精华
初级会员, 积分 56, 距离下一级还需 144 积分
在线时间0 小时
谁在在做STM32F407关于网络通信的东西啊,一起讨论啊,我的QQ:
主题帖子精华
初级会员, 积分 98, 距离下一级还需 102 积分
在线时间0 小时
回复【楼主位】hrz2ml:
---------------------------------
悲剧啊,我也碰上这个问题了。。。
新人求指导~~~
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
楼主的问题,解决没?我用STM32F107+Lwip,遇到了同样的问题,求指点
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
我最近也在搞stm32f107+LWIP作为TCP客户端,发现使用ST公司提供的测试软件和LwIP应用指南&V0.01.pdf这个文章里面提到的软件,都可以测试成功。但使用正常的window&API接口实现的程序,一连接上服务器就马上断开了。后来使用科来分析软件看了下,结果发现:在TCP的第三次握手那里,客户端这边不仅仅是发了ACK,还发了数据。&
在调用函数:tcp_connect(pcb,&&server_addr,&1010,&tcp_client_connect);&如果在tcp_client_connect函数里面使用了&tcp_write(pcb,&GREETING,&strlen(GREETING),&1);就会出现这种情况,导致TCP的state为SYNC,而不是establish。
主题帖子精华
高级会员, 积分 527, 距离下一级还需 473 积分
在线时间11 小时
回复【7楼】aa:
---------------------------------
重点是之后一句&tcp_close(),屏蔽掉这句
主题帖子精华
中级会员, 积分 369, 距离下一级还需 131 积分
在线时间6 小时
回复【7楼】aa:
---------------------------------
我在做103+ENC28J60+LWIP+DHCP,之前这样103+ENC28J60+LWIP可以同时实现client&和server,现在加上DHCP,成功分配IP后,server功能能行,但client却connect不上;我在tcp_connect(client_pcb,&&destip,&1206,&tcp_client_connected);中调用的tcp_client_connected里面有用tcp_write,并没有你所说的连上断的现象。而且这个返回值也是ERR_OK,成功调用tcp_output,pcb-&state == SYN_SENT;
& ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS
#if LWIP_TCP_TIMESTAMPS
& & & & & & & & & & | TF_SEG_OPTS_TS
调试发现,tcp_output,输出调试信息nothing to send
主题帖子精华
中级会员, 积分 369, 距离下一级还需 131 积分
在线时间6 小时
这个问题会是网卡设置的问题么,进入SYN_SENT后,就待ACK,可是跟踪发现,网卡并没接收到包,这个原因是什么呢,是SERVER没发包,还是网卡没收到。
主题帖子精华
中级会员, 积分 369, 距离下一级还需 131 积分
在线时间6 小时
回复【8楼】nonplus:
---------------------------------
你有没有遇到connect不上的问题呢,怎么解决。
之前没加DHCP,能成功的连上,无论是用作CLIENT还是SERVER都能通过路由和PC连上,两个功能同时运行也可以,用的TCP&UDP测试工具。
现在在原代码的基础上加上DHCP功能(代码改动很小,client和server相关的代码就没改,只#define&LWIP_DHCP&1和在netconfig.c里加上dhcp_start),
现在能成功分配IP,能够PING通,用做server时,能成功连上,但是,做client时,连不上了。tcp_connect内调用的tcp_enqueue的返回值也是ERR_OK,并成功调用tcp_output。现在是问题出在哪儿都不知道。
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
我也在弄stm32+lwip来实现tcp的client,也遇到上面的问题,有人解决了?求指教啊
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
请看我的帖子,希望有帮助!
/thread--1.html
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
typedef&struct&_XTCPCLIENTSOCK{
/*socket&标识符&-1无效,&=&0&有效*/
/*socket&是否连接成功,0&未连接,&=&1&连接*/
xSemaphoreHandle sxM/*互斥量,socket不是线程安全的,为了实现socket
在一个线程里接收数据,而在其他线程发送,
建立互斥量来做互斥操作*/
}XTCPCLIENTSOCK;
XTCPCLIENTSOCK&xClientS
#define&BUF_SIZE
32
char&ClientRevBuf[BUF_SIZE];
void&TCPClient(void&*arg)
{
struct&sockaddr_in&ServerA
int&optval&=&1;
struct&timeval&
xClientSocket.bconnect&=&0;
//建立互斥量
xClientSocket.sxMutex&=&xSemaphoreCreateMutex();
if(xClientSocket.sxMutex&==&NULL&)
//创建客户端
xClientSocket.s&=&lwip_socket(&AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(xClientSocket.s&==&-1&){
//创建成功
optval&=&1;
lwip_setsockopt(xClientSocket.s,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof(optval));
ServerAddr.sin_family&=&AF_INET;
ServerAddr.sin_addr.s_addr&=&inet_addr(&192.168.0.80&);//
ServerAddr.sin_port&=&htons(8080);
xClientSocket.bconnect&=&0;
//连接服务器
if(&lwip_connect(xClientSocket.s,(struct&sockaddr*)&ServerAddr,sizeof(ServerAddr)&)&==&-&1)
//connect&error!
lwip_close(xClientSocket.s);
xClientSocket.bconnect&=&1;
//是否接收到数据
FD_ZERO(&fdsr);
FD_SET(xClientSocket.s,&fdsr);
tv.tv_sec&=&10;
tv.tv_usec&=&0&;
if(&lwip_select(xClientSocket.s&+&1,&fdsr,NULL,0,&tv)&==&0&)
if(&FD_ISSET(xClientSocket.s,&&fdsr)&)
//有数据,互斥操作
if(&xSemaphoreTake(&xClientSocket.sxMutex,&portMAX_DELAY&)&!=&pdTRUE&){
datalen&=&lwip_recv(xClientSocket.s,ClientRevBuf,BUF_SIZE,0);
if(datalen&&&0)
//接收的数据,测试,回送给服务器
ret&=&lwip_send(xClientSocket.s,ClientRevBuf,datalen,0);
//服务器关闭等异常
xClientSocket.bconnect&=&0&;
lwip_close(xClientSocket.s);
xSemaphoreGive(&xClientSocket.sxMutex&);
//重新连接服务器
xSemaphoreGive(&xClientSocket.sxMutex&);
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
我也写了个STM32F107+LWIP客户端程序,用RawAPI在connected中调用tcp_write,服务器用TCP/UDP测试工具,发现一个不正常的地方就是:在connected用tcp_writ输出的内容服务器收不到。其他的收发都正常,感觉很迷惑。
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
我现在也遇到这个问题了,请问你解决了没,能把你的解决方案说一下吗
主题帖子精华
初级会员, 积分 139, 距离下一级还需 61 积分
在线时间31 小时
请在tcp_write(pcb, GREETING, strlen(GREETING), 1);后加一句pbuf_free(p);
static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
& tcp_write(pcb, GREETING, strlen(GREETING), 1);
pbuf_free(p);
& &return ERR_OK;
主题帖子精华
新手上路, 积分 26, 距离下一级还需 24 积分
在线时间0 小时
回复【11楼】can123dao:
---------------------------------
我也遇到client端连不上pc的问题,可以交流下。qq
主题帖子精华
新手上路, 积分 26, 距离下一级还需 24 积分
在线时间0 小时
回复【18楼】molin2015:
---------------------------------
还有人遇到类似问题吗。我的是作为服务端都正常,客户端不正常啊。tcp_connect返回ok,可是pc收不到syn包。强制pcb-》state=established,之后tcp_write&也抓不到包。总之就是作为客户端。没有抓到任何包
主题帖子精华
在线时间41 小时
struct&tcp_pcb&*pcb=NULL;
&&&IP4_ADDR(&client_addr,&192,&168,&0,&192);&
&&&IP4_ADDR(&server_addr,&192,&168,&0,&32);
&&&/*&Create&a&new&TCP&control&block&&*/
&&&pcb&=&tcp_new();
&if(pcb!=NULL)
&{
&&&&/*&Assign&to&the&new&pcb&a&local&IP&address&and&a&port&number&*/
&&&&tcp_bind(pcb,&&client_addr,&1010);//客户端端口号为33
&&&&//注册连接出错处理函数
&&&&tcp_err(pcb,&tcpaa_conn_err);&//hrz
&&&&tcp_recv(pcb,&tcpaa_recv);//接收到数据的回调函数设置
&&&&/*&Connect&to&the&server:&send&the&SYN&*/
&&&&ret=tcp_connect(pcb,&&server_addr,&1010,&tcp_client_connect);//服务器端口号为25
&}&&
这是两个线程,客户端和服务器端分开初始化?
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
主题帖子精华
新手上路, 积分 39, 距离下一级还需 11 积分
在线时间0 小时
求交流这个通讯的知识&&&q
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
回复【21楼】知嗅:
---------------------------------
请问你现在关于这个以太网通信有进展么
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
回复【7楼】aa:
---------------------------------
请问你现在作为客户端程序成功了么?可否分享一下经验
Powered by君,已阅读到文档的结尾了呢~~
alientek lwip 开发手册
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
alientek lwip 开发手册
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口22101人阅读
LWIP使用经验
一 LWIP内存管理
LWIP的内存管理使用了2种方式:内存池memp和内存堆mem,如图1所示。
内存池的特点是预先开辟多组固定大小的内存块组织成链表,实现简单,分配和回收速度快,不会产生内存碎片,但是大小固定,并且需要预估算准确。
内存堆的本质是对一个事先定义好的内存块进行合理有效的组织和管理,主要用于任意大小的内存分配,实现较复杂,分配需要查找,回收需要合并,容易产生内存碎片,需要合理估算内存堆的总大小。
图1内存池与内存堆
1.&&&& 数据包管理
数据包管理结构pbuf共有四种类型,它们的特点和使用场合如表1所示。
内存堆,包括pbuf和数据区
长度不定,分配耗时
应用程序和协议栈
内存池,包括pbuf和数据区
长度固定,分配快
中断服务程序
内存池,仅包括pbuf
所指数据位于ROM中
应用程序引用内存区
内存池,仅包括pbuf
所指数据位于RAM中
应用程序引用内存区
表1 &pbuf类型与特点
每一种pbuf分配内存的方式都不一样,如图2所示。
图2四种数据包管理结构
只有选择合适的pbuf类型才能发挥LWIP的最大性能,一个数据包可能是多种pbuf的组合,用链表连接起来,如图3所示。
图3 &pbuf链表
2.&&&& 设置内存大小
为LWIP开辟一个专用的内存堆是应该的,这样一来LWIP的mem_alloc()和mem_free()都将基于该堆内存进行分配和回收,不影响其他系统内存的使用。如图1左所示,lwipopt.h文件中宏MEM_SIZE定义了堆区的大小,对于一个负荷较重的系统堆区需要分配较大。
图4堆和PBUF_ROM内存区
LWIP使用PBUF_ROM类型的内存池来发送“只读”数据(处于ROM中或者其他进程中不可修改),宏MEMP_NUM_PBUF定义了该缓冲池的个数,如图2右所示。
在ISR(中断服务程序中)经常需要快速分配一部分内存进行数据存储,这是通过PBUF_POOL类型的缓冲区实现的。为此需要定义两个宏:PBUF_POOL_SIZE定义缓冲池的个数,PBUF_POOL_BUFSIZE定义单个缓冲区的大小,如图5所示。
PBUF_POOL内存区
3 宏编译开关
若定义MEM_LIBC_MALLOC=1,直接使用C库中的malloc、free来分配动态内存;否则使用LWIP自带的mem_malloc、mem_free等函数。
若定义MEMP_MEM_MALLOC=1,则memp.c中的全部内容不会被编译,用内存堆来实现内存池分配,使用这种方式得考虑是否能忍受内存堆分配带来的时间延迟。
若定义MEM_USE_POOLS=1,则mem.c中的全部内容不会被编译,用内存池来实现内存堆的分配,使用这种方式得考虑是否能忍受因为POOL内存固定大小而带来的内存浪费。此外用户需要定义宏MEM_USE_CUSTOM_POOLS=1,还需要额外实现一个头文件lwippools.h,并在其中开辟一些用于内存堆分配函数的内存池POOL,开辟空间的格式如下:
LWIP_MALLOC_MEMPOOL_START
LWIP_MALLOC_MEMPOOL(20, 256)
LWIP_MALLOC_MEMPOOL(10, 512)
LWIP_MALLOC_MEMPOOL_END
二 LWIP启动时序
图6展示了LWIP启动时序,大部分函数都是LWIP自带的,主要的移植代码是eth_init()实现初始化以太网接口,启动程序会创建2个线程:tcpip_thread负责LWIP的绝大部分工作(主要是协议栈的解析和系统运行),ethernetif_thread负责从网口接收数据包再交付给tcpip_thread线程进行处理。
图6 LWIP启动函数
三 LWIP运行逻辑
1 接收数据包
图7接收数据包
当以太网口接收到一个数据包后,EMAC_IRQ中断服务程序通过信号量通知ethernetif线程,ethernetif线程调用low_level_input()接收该数据包并通过邮箱交付给tcpip_thread线程,tcpip_thread根据该数据包的类型进行相应处理。它是建立在消息传递的基础上的,如图8所示。
图8数据包消息的产生和处理
2& SequentialAPI函数调用
API设计的核心在于让用户进程负责尽可能多的工作,例如数据的计算、拷贝等;而协议栈进程只负责简单的通信工作,这是很合理的,因为系统可能存在多个应用程序,它们都使用协议栈进程提供的通信服务,保证内核进程的高效性和实时性是提高系统性能的重要保障。进程之间通信使用IPC技术,包括邮箱、信号量和共享内存,如图9所示。
图9协议栈API实现
以函数netconn_bind()为例看API是如何实现的,首先用户程序中调用函数netconn_bind()绑定一个连接,则这个函数实现时,是通过向内核进程发送一个TCPIP_MSG_API类型的消息,告诉内核进程执行do_bind函数:在消息发送后,函数阻塞在信号量上,等待内核处理该消息;内核在处理消息时,会根据消息内容调用do_bind,而do_bind会根据连接的类型调用内核函数udp_bind、tcp_bind或raw_bind;当do_bind执行完后,它会释放信号量,这使被阻塞的netconn_bind得以继续执行,整个过程如图10所示。
图10 API函数实现
四 TCP/IP核心知识点
1.&&&&&& 滑动窗口
图11滑动窗口
接收窗口相关的字段中,rcv_nxt是自己期望收到的下一个字节编号,rcv_wnd表示接收窗口的大小,rcv_ann_wnd表示将向对方通告的窗口大小值,这个值在报文发送时会被填在首部中的窗口大小字段,rcv_ann_right_edge记录了上一次窗口通告时窗口右边界取值。上面这四个字段都会随着数据的发送和接收动态地改变,如图12所示。
图12接收窗口
发送窗口中,lastack记录了被接收方确认的最高序列号,snd_nxt表示自己将要发送的下一个数据的起始编号,snd_wnd记录了当前的发送窗口大小,它常被设置为接收方通告的接收窗口值,snd_lbb记录了下一个被应用程序缓存的数据的起始编号,如图10所示。
上面这四个字段的值也是动态变化的,每当收到接收方的一个有效ACK后,lastack的值就做相应的增加,指向下一个待确认数据的编号,当发送一个报文后,snd_nxt的值就做相应的增加,指向下一个待发送数据,snd_nxt和lastack之间的差值不能超过snd_wnd的大小。
由于实际数据发送时是按照报文段的形式组织的,因此可能存在这样的情况:即使发送窗口允许,但并不是窗口内的所有数据都能发送以填满窗口,如图13中编号为11~13的数据,可能因为它们太小不能组织成一个有效的报文段,因此不会被发送。发送方会等到新的确认到来,从而使发送窗口向右滑动,使得更多的数据被包含在窗口中,这样再启动下一个报文段的发送。
图13发送窗口
2.&&&&&& 三次握手
图14连接建立过程
3.&&&&&& 断开连接
图15连接断开过程
4.&&&&&&TCP状态转换
图16& TCP状态转换图
5.&&&&&& 同时打开
图17双方同时打开
6.&&&&&& 同时关闭
图18双方同时关闭
五正确使用LWIP
一般说来LWIP协议栈是比较稳定的,尤其像V1.3.2经历过业界广泛使用和工程应用,完全可以应用于嵌入式产品。那为什么还是有很多人反映LWIP不稳定呢?主要是以下几个方面的原因:
1.&&&&& 网络硬件驱动&确保EMAC口接收与发送稳定可靠
2.&&&&& 移植LWIP&基于OS的移植代码正确稳定
3.&&&&& 配置LWIP&根据设备RAM尺寸进行合理配置
1)&&&&&&& 值(PBUF_POOL_SIZE * PBUF_POOL_BUFSIZE)必须大于TCP_SND_BUF和TCP_WND,否则容易引起错误;
2)&&&&&&& 当内存有限时TCP发送不能太快(具体值依赖于分配内存的大小),否则引起tcp_enqueue()逻辑错误;
4.&&&&& 调用LWIP的API函数&正确使用API函数,特别防止内存泄露。
5.&&&&& 资源不足&打开报警提醒,当资源不够时提醒设计者
六 LWIP常见问题
1.&&&&&& 网卡驱动程序
首先,必须将协议栈完全初始化才能打开网络接收功能,接收中断必须将数据封装在PBUF中,然后交会给协议栈内核处理。其次,LWIP的全局变量(arp_table,netif_list,udp_pcbs等)确保赋初值0,否则容易一运行就崩溃。
2.&&&&&& 内存泄露
第一个原则(责任制):谁分配内存,谁就负责回收。
第二个原则(对称性):分配内存者与回收内存者一一对应构成闭环。
另外,需要特别注意一些系统函数的调用,它们也会带来内存泄露,如:
newconn = netconn_accept(conn);
do_something_for(newconn);
netconn_close(newconn);
netconn_delete(newconn);&&&/*一定要释放newconn否则将导致内存泄露
inbuf = netconn_recv(conn);
do_something_for(inbuf);
netbuf_delete(inbuf);&&&/*一定要释放inbuf否则将导致内存泄露
3.&&&&&&PC机无法与LWIP建立TCP连接
问题:PC机能够与LWIP设备PING操作成功,但是无法建立TCP连接。
原因:通过代码跟踪,发现LWIP发出了SYN+ACK数据包,但是PC机无法接收该握手数据包,该数据包为60字节,小于以太网的最小长度(64字节),而LWIP设备的EMAC没有设置短小数据包填充功能,导致PC机无法接收该短数据包。
解决:使能EMAC的短小数据包填充功能。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:255218次
积分:3369
积分:3369
排名:第8415名
原创:111篇
评论:75条
(20)(1)(18)(6)(10)(1)(2)(1)(2)(7)(2)(2)(2)(9)(5)(1)(1)(1)(6)(2)(1)(3)(2)(2)(8)(1)帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:真●酱油帝发信人: BrotherMe ([0m [1;35m ║║), 信区: VisualC
标&&题: TCP和UDP同时监听同一个端口
发信站: 水木社区 (Thu Jun 12 08:26:18 2014), 站内 && tcp udp TCP和UDP同时监听同一个端口时,UDP接受到的包是仅有UDP协议发送的么?还是TCP和UDP协议发的包它都可以接受到啊??????&& 更多 分享到:&& 相关帖子推荐:&& LWIP 主动发送tcp的问题 iocp udp 某一端口的数据在wsarecvfrom 返回 WSA_IO_PENDING ,但是其他端口还正常 关于socket通信,client关闭,server捕获到SIGPIPE,进程崩溃 如何丢弃不想要的包 Android设备做服务器端 TCP连接异常 Android 的 ipv6 socket 怎么写?一直报错 求各路大神帮忙,新手求教java局域网聊天小程序
-- && ※ 来源:·水木社区 ·[FROM: 222.173.220.*]
文章数:1&分页:Stm32(1)
Lwip学习笔记之UDP
Lwip严格按照协议的分层进行管理,每个层之间传送数据都需要进行上下文交换。lwIP所使用的过程模型是:把所以协议封装到一个单一的过程中,从而与操作系统内核分开。应用程序可能也驻留在lwIP处理过程中,或者在单独的过程中。 TCP/IP栈和应用程序之间的通信可以通过函数调用实现,也可以通过更为抽象的API。
Lwip的消息传递采用了邮箱的机制,邮箱有两种操作:邮寄和提取,邮寄操作不会阻塞进程;邮寄到邮箱的消息由操作系统模拟层排入队列知道另一个进程来提取他们。
包缓冲pbufs
Pbuf在Lwip中表示一包,Pbuf能在一张列表中被连接到一起,形成一个pbuf链,Pbuf具备三种类型,Pbuf Ram,Pbuf Rom,Pbuf Pool,一个Pbuf链可以包含多种类型的pbuf。
三种类型不同的使用,pbuf_pool主要被网络设备驱动程序使用,当引用程序发送位于北应用程序管理的存储区的数据时,Pbuf_ROM被使用。在pbuf被移交到TCP/IP栈后,数据不能修改,因此命名为Pbuf_ROM。
Pbuf的内部结构
Pbuf的内部结构如下图所示:
指向下一个Pbuf的指针
Pbuf数据的起始位置
数据内容的长度
随后所有Pbuf中的len中的值的总和??
表明pbuf类型
pbuf的操纵
Pbuf_alloc()完成分配一个pbuf的任务。
Pbuf_ref()增加参考计数
Pbuf_free()完成释放分配,他首先减少pbuf的参考计数,如果参考计数达到0则表示pbuf已经被释放。
Lwip仅仅实现最基本的IP功能,可以发送、接收和转接包,但不能发送或接收分割的IP包,也不能处理带IP选项的包,不符合条件的包会被丢弃。如果接收的包是主机指定的包,则由protocol域来决定传给哪个高层协议。接收包由ip_input()函数来处理。
发送的包由ip_output()处理,它使用ip_route()寻找适当的网络接口来上传包。当时发送包的网络接口被确定,包被传递到ip_output_if()函数。
ICMP,TCP和UDP都是比IP协议高一层的协议,当IP协议收到包且地址符合后,将会把包传递上层协议进行处理。如果IP协议收到的包与IP地址不一致,则会转发。转发由Ip_forward()完成。
每一个UDP话路(session)的状态都保存在一个PCB结构中,UDP PCBs保存在一个链表中,当UDP datagram到达,则搜索该链表并进行匹配。
UDP的输入输出如图所示:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1792次
排名:千里之外

我要回帖

更多关于 openvpn tcp udp 共存 的文章

 

随机推荐