一个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了,请教各位大大
...全文
204 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
  • 打赏
  • 举报
回复
先把参数的参数检查一下。

64,644

社区成员

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

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