关于 RTT 的 select 支持

发布于 2019-07-19 20:34:56    浏览:1014
    本帖最后由 alexsunmiu 于 2019-7-19 20:52 编辑


看了一会 rtt 的 select 的资料,私以为 rtt 的实现仍然不够全面;


当前由于 lwip 的 socket fd 不能跨线程使用,默认的 bsd api 为阻塞模式,难以做多路复用,所以 rtt 支持 select ,网站上有几个例子简单的说了下select 用法。

但问题在于:
1,网站上所有的例子,开启select 后,都是使用固定 buffer size 来进行 recv 的,譬如 recv(fd, ptr, 1024, 0); 这种模式,如果服务器正好发送了足够的内容,则返回值上是看不出来 “是否还需要继续 recv ” 的。
2,若继续 recv ,如果缓冲区为空,select 之后的 recv,依然会 阻塞。
3,若将socket 设置为 非阻塞模式,static int v=1;ioctlsocket(fd, FIONBIO, &v); 后,进行recv,若缓冲区无内容,直接返回 -1,通过此返回值依然无法判断,只能以为是 socket 异常而关闭连接; POSIX的实现是,设 errno == EAGAIN 进行判断,我查了下, 好像没有 RT_EAGAIN 定义。

或者是我使用姿势不对,请教大佬正确用法~先谢过。


好吧,实地测试,还是勉强能用的,如果发送数据超过 固定缓冲区,则事件会自动再次触发;

我的锅,我类比为 epoll 的边缘触发模式了,原来 select 一直是 水平触发模式~

查看更多

1 个回答
aichip_mac
aichip_mac 2019-07-22
This guy hasn't written anything yet
大佬 你的select是咋用的 为啥我的select一直卡在poll那里

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
1k

发布
问题

分享
好友

手机
浏览

扫码手机浏览