OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7890|回复: 6

请问服务器端的lwIP tcp_poll发送数据只能通过回调poll来实现吗?

[复制链接]

15

主题

32

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-1-19
在线时间
23 小时
发表于 2017-7-5 15:30:06 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 495208604 于 2017-7-5 15:36 编辑

1.png
就是这个函数,我感觉通过回调函数来发数据好蠢啊~~~有没有函数可以直接发数据的呀??

最佳答案

查看完整内容[请看2#楼]

那就改啊,将poll中发送的数据的过程做成一个函数来发送!每次发送数据的时候直接调用这个函数就行了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-7-5 15:30:07 | 显示全部楼层
那就改啊,将poll中发送的数据的过程做成一个函数来发送!每次发送数据的时候直接调用这个函数就行了
回复

使用道具 举报

15

主题

32

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-1-19
在线时间
23 小时
 楼主| 发表于 2017-7-6 08:01:04 | 显示全部楼层
zuozhongkai 发表于 2017-7-5 15:48
那就改啊,将poll中发送的数据的过程做成一个函数来发送!每次发送数据的时候直接调用这个函数就行了

....系统调用的poll,再里面已经看不懂了。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-7-7 00:59:33 | 显示全部楼层
495208604 发表于 2017-7-6 08:01
....系统调用的poll,再里面已经看不懂了。。。

慢慢学啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2017-7-26
在线时间
2 小时
发表于 2017-7-26 15:30:33 | 显示全部楼层
LWIP的作者既然提供了此接口必然有其作用及道理,LWIP会提供愚蠢的接口的话,那我们不都可以去撞墙了

首先,你得弄明白这个poll定时回调的作用及意义是什么,此回调函数是让使用者定期 “针对当前连接” 进行一些操作,比如你的例子里面的发送数据。1.注意回调函数的第二个参数,它就是 “当前连接”的pcb控制块,你就可以在此回调函数中使用这个pcb块来针对当前连接进行操作,因为TCP是可以多连接的。
2.此函数是LWIP系统回调,它可以最大程度保证传递给你的当前pcb控制块的有效性。

举例说:
1. 你新建了一个服务器pcb: struct tcp_pcb *server_pcb = tcp_new(); 然后绑定,监听,设置accept回调;
2. 这时个有两个客户端A和B连接到了你的服务器,自动为两个新连接建立各自的pcb控制块,控制块以参数的形式传递给accept回调。
3.这时候服务器想给B连接发送数据,好家伙,怎么发,你只有server_pcb这个服务器控制块,直接tcp_write(server_pcb...) ?协议栈根本不知道你要发给A还是B
   但是你在poll回调中就可以使用参数里的pcb正确的给此连接发送数据。

那么说,我不进行其它操作,只是要发数据而已,又不想使用poll回调可以么(poll回调设置为null: tcp_poll(pcb,null....)?

当然可以:
方法1:在recv回调中使用参数传递的pcb来发送数据. (如果你的数据接收是用中断实现的,那么最好不要使用此方法;而且必须等到客户给你发数据后你才能回发,不能主动发)

方法2:在accept回调函数中新建一个pcb来保存此连接的pcb:
struct tcp_pcb *client_pcb[x];
int client_count=0;
accept_callback(void *arg,struct tcp_pcb *new_pcb,err_t err)
{
   ......
  client_pcb[client_count++] = new_pcb;
}
然后你就可以在任何地方使用tcp_write(client_pcb[x])来给指定客户发数据了。(此方法你需要自己去保证在pcb的有效性)

好了,看了以上两种无poll的实现方法,我想你应该对poll回调函数的存在意义有一定的理解了吧。
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-7-28 09:43:40 | 显示全部楼层
WBO0772 发表于 2017-7-26 15:30
LWIP的作者既然提供了此接口必然有其作用及道理,LWIP会提供愚蠢的接口的话,那我们不都可以去撞墙了

...

感谢!
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-6-3
在线时间
1 小时
发表于 2020-12-16 10:45:12 | 显示全部楼层
WBO0772 发表于 2017-7-26 15:30
LWIP的作者既然提供了此接口必然有其作用及道理,LWIP会提供愚蠢的接口的话,那我们不都可以去撞墙了

...

大神我想请教下我的板子可以正常收信息但是tcp_server_poll不执行是什么原因啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表