一个FD_SET问题

greenweather 2011-04-25 11:07:36
有个进程调用这个函数,

int SockCanRead(int iSocketId, int timeout)
{
fd_set readfds;
int iMaxFd;
struct timeval stuTime;
int iReady;
iMaxFd = iSocketId;
memset((char *)&readfds, 0, sizeof(fd_set));
FD_ZERO(&readfds);
FD_SET(iSocketId, &readfds);
if (timeout > 0){
stuTime.tv_sec = timeout;
stuTime.tv_usec = 0;
iReady = select(iMaxFd + 1, &readfds, NULL, NULL, &stuTime);
}
else{
iReady = select(iMaxFd + 1, &readfds, NULL, NULL, NULL);
}
if (iReady > 0 && FD_ISSET(iSocketId, &readfds)){
return 0;
}
else{
return -1;
}
}

执行到FD_SET(iSocketId, &readfds);这句直接导致core了,请教各位大大
...全文
259 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenweather 2011-04-26
  • 打赏
  • 举报
回复
如果套接字小于0,然后做write或者read会出问题是吧?
maoxing63570 2011-04-25
  • 打赏
  • 举报
回复
你需要给FD_SET的第一个参数传一个套接字,typedef UINT_PTR SOCKET;这个是套接字的类型
nfer_cn 2011-04-25
  • 打赏
  • 举报
回复
进到函数内部,先判断参数
if (iSocketId == -1)
{
return -1;
}
nfer_cn 2011-04-25
  • 打赏
  • 举报
回复
memset((char *)&readfds, 0, sizeof(fd_set));
把这行去掉试试
justkk 2011-04-25
  • 打赏
  • 举报
回复
哦 你自己已经找到原因了

从头文件中看
#define __FD_SET(d, s) (__FDS_BITS (s)[__FDELT(d)] |= __FDMASK(d))

这样如果d < 0,那么将访问一个无效的下标
greenweather 2011-04-25
  • 打赏
  • 举报
回复
问题在于如果iSocketId<0,那句才会过不去,进程就core了
justkk 2011-04-25
  • 打赏
  • 举报
回复
这段代码没看出问题
nfer_cn 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 greenweather 的回复:]

引用 6 楼 maoxing63570 的回复:

你需要给FD_SET的第一个参数传一个套接字,typedef UINT_PTR SOCKET;这个是套接字的类型

那个套接字有另外一个函数生成的,呵呵,应该不是这个问题
[/Quote]
但是要对传入的参数进行判断啊!
greenweather 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maoxing63570 的回复:]

你需要给FD_SET的第一个参数传一个套接字,typedef UINT_PTR SOCKET;这个是套接字的类型
[/Quote]
那个套接字有另外一个函数生成的,呵呵,应该不是这个问题
Sou2012 2011-04-25
  • 打赏
  • 举报
回复
先把参数的参数检查一下。
内容概要:本文研究了基于粒子群优化算法(PSO)的抽水蓄能电站最佳调度方案,旨在通过智能优化算法解决电站运行中的多约束、多目标调度问题。文中深入分析了抽水蓄能电站的运行特性与核心调度约束,构建了兼顾经济性、系统稳定性与电网调峰能力的多目标优化体系,并针对传统调度方法在全局寻优与动态响应方面的不足,提出采用粒子群优化算法进行高效求解。研究通过Matlab仿真平台完成了算法建模与调度逻辑的设计与实现,仿真结果表明,该方法能有效提升调度效率、降低运行成本,并显著增强电力系统对可再生能源的消纳能力和调峰灵活性。; 适合人群:具备电力系统、运筹学或自动化等相关领域基础知识,同时拥有一定Matlab编程与仿真实践能力的研究生、科研人员以及从事能源系统优化、电力调度工作的工程技术人员。; 使用场景及目标:①应用于抽水蓄能电站的日度或短期优化调度,实现发电与抽水计划的科学制定,提升能源利用效率与经济效益;②为新型电力系统中储能资源的智能调度提供先进的算法支持与可靠的仿真验证方案;③作为智能优化算法在能源电力领域应用的典型教学与科研案例,深化对元启发式算法求解复杂工程问题的理解。; 阅读建议:建议读者结合提供的Matlab代码,深入理解粒子群优化算法在电力调度问题中的具体实现流程,重点关注目标函数的数学建模、多重约束条件的处理技巧以及算法关键参数的调优策略,并可通过修改负荷预测曲线、调整电站参数或引入新的优化目标等方式,进一步拓展仿真场景,深化研究。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧