Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
select
请教 select问题
发布于 2018-05-31 14:58:38 浏览:3566
订阅该版
使用lwip的ppp模式,驱动4G模块。 现在网络能正常使用。 但是使用select功能发现会导致死机。 阅读了net_sockets的实现,发现POSIX接口使用了一层映射将socket 句柄转换为文件系统句柄, socket, recv , send等接口都做了映射,唯独select没有做映射。 所以有些疑惑,怀疑是select实现有bug。 自己将socket映射后调用lwip_select发现问题解决。 不是很清楚是系统问题还是我的使用问题。 ```c int select(int s, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout) { int ret; int sock = dfs_net_getsocket(s); if ( readset ) { FD_ZERO(readset); FD_SET(sock,readset); } if ( writeset ) { FD_ZERO(writeset); FD_SET(sock,writeset); } ret = lwip_select(sock + 1,readset, writeset, exceptset,timeout); if ( ret > 0 ) { if (!FD_ISSET(sock, readset) && !FD_ISSET(sock, writeset)) { rt_kprintf("Should NOT arrive"); } } return ret; } ```
查看更多
7
个回答
默认排序
按发布时间排序
Cheney_Chen
2018-05-31
这家伙很懒,什么也没写!
系统中自带select函数,不需要自己封装实现,使用select函数需要开启在ENV中开启`RT_USING_DFS_NET`使用标准POSIX接口,头文件引用`#include
`即可使用 [attach]3892[/attach]
Hubert_Xie
2018-06-01
这家伙很懒,什么也没写!
>系统中自带select函数,不需要自己封装实现,使用select函数需要开启在ENV中开启`RT_USING_DFS_NET`使 ... 我已经开启了以下两个宏,应用代码在Linux中能正常运行的。 ```c RT_USING_DFS_NET RT_USING_POSIX ```
Hubert_Xie
2018-07-19
这家伙很懒,什么也没写!
阅读了net_sockets的实现,发现POSIX接口使用了一层映射将socket 句柄转换为文件系统句柄, socket, recv , send等接口都做了映射,唯独select没有做映射。 所以有些疑惑,怀疑是select实现有bug。
wandersky
2018-08-09
这家伙很懒,什么也没写!
我也发现问题了,我在调试ftp服务器的时候,由于PASV模式,使用到select然后就不正常,使用PORT模式,就没有问题。 ```c else if(str_begin_with(buf, "PASV")==0) { int dig1, dig2; int sockfd; int optval='1';//char optval='1';//willow change session->pasv_port = 10000; session->pasv_active = 1; local.sin_port=htons(session->pasv_port); local.sin_addr.s_addr=INADDR_ANY; dig1 = (int)(session->pasv_port/256); dig2 = session->pasv_port % 256; FD_ZERO(&readfds); if((sockfd=socket(PF_INET, SOCK_STREAM, 0))==-1) { rt_sprintf(sbuf, "425 Can't open data connection.\r\n"); send(session->sockfd, sbuf, strlen(sbuf), 0); goto err1; } if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))==-1) { rt_sprintf(sbuf, "425 Can't open data connection.\r\n"); send(session->sockfd, sbuf, strlen(sbuf), 0); goto err1; } if(bind(sockfd, (struct sockaddr *)&local, addr_len)==-1) { rt_sprintf(sbuf, "425 Can't open data connection.\r\n"); send(session->sockfd, sbuf, strlen(sbuf), 0); goto err1; } if(listen(sockfd, 1)==-1) { rt_sprintf(sbuf, "425 Can't open data connection.\r\n"); send(session->sockfd, sbuf, strlen(sbuf), 0); goto err1; } rt_kprintf("Listening %d seconds @ port %d\n", tv.tv_sec, session->pasv_port); //rt_sprintf(sbuf, "227 Entering passive mode (%d,%d,%d,%d,%d,%d)\r\n", 127, 0, 0, 1, dig1, dig2); rt_sprintf(sbuf, "227 Entering passive mode (%d,%d,%d,%d,%d,%d)\r\n", 0, 0, 0, 0, dig1, dig2); send(session->sockfd, sbuf, strlen(sbuf), 0); FD_SET(sockfd, &readfds); select(0, &readfds, 0, 0, &tv); if(FD_ISSET(sockfd, &readfds)) { if((session->pasv_sockfd = accept(sockfd, (struct sockaddr*)&pasvremote, &addr_len))==-1) { rt_sprintf(sbuf, "425 Can't open data connection.\r\n"); send(session->sockfd, sbuf, strlen(sbuf), 0); goto err1; } else { rt_kprintf("Got Data(PASV) connection from %s\n", inet_ntoa(pasvremote.sin_addr)); session->pasv_active = 1; closesocket(sockfd); } } else { err1: closesocket(sockfd);//closesocket(session->pasv_sockfd); session->pasv_active = 0; rt_free(sbuf); return 0; } ``` 正在努力解决中。。。
wandersky
2018-08-09
这家伙很懒,什么也没写!
头文件已经修改如下 ```c #include
#include
#include
//#include
#include
```
armink
2018-08-09
这家伙很懒,什么也没写!
>我也发现问题了,我在调试ftp服务器的时候,由于PASV模式,使用到select然后就不正常,使用PORT模式,就没 ... select 功能在 RT-Thread 中还是蛮常用的。 MQTT 软件包中,还同时对 PIPE 和 网络一起使用 select 。可否先对比具体的调用代码。
wandersky
2018-08-10
这家伙很懒,什么也没写!
已解决 `select(0, &readfds, 0, 0, &tv);` 使用有问题,应该 `select(FD_SETSIZE, &readfds, 0, 0, &tv);`
撰写答案
登录
注册新账号
关注者
0
被浏览
3.6k
关于作者
Hubert_Xie
这家伙很懒,什么也没写!
提问
6
回答
35
被采纳
0
关注TA
发私信
相关问题
1
接收数据不触发select
2
之前select死循环的问题查清楚了
3
支持多个fd同时select,目前的rtt貌似不支持
4
非阻塞 socket
5
使用fifo通道读取数据select不返回
6
select不返回问题,昨天未描述清楚
7
请问Kconfig中select 如何选择非bool值的config的值呢
8
tcpclient_select_sample 等待网络函数参数问题
9
select poll bug 导致内存泄漏
10
串口接收使用select后,偶发线程挂起了无法超时恢复
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部