天线|RF射频
直播中

马祥

7年用户 774经验值
私信 关注
[问答]

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


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

回帖(5)

李俊

2019-10-14 06:27:39
那就改啊,将poll中发送的数据的过程做成一个函数来发送!每次发送数据的时候直接调用这个函数就行了
举报

贾佳斌

2019-10-14 06:46:06
....系统调用的poll,再里面已经看不懂了。。。
举报

黄勇

2019-10-14 06:54:20
慢慢学啊
举报

陈政竹

2019-10-14 07:01:47
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回调函数的存在意义有一定的理解了吧。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分