专门为难C高手,select函数出错问题!!!

jamesontan 2008-09-12 06:01:50
开发平台:solaris 10 sprac

部分程序代码

int nMaxSock;
struct timeval wait;
fd_set fdset;
while(1)
{
/* ①创建套接字描述符集合 */
FD_ZERO(&fdset);
FD_SET(nLocalSock,&fdset);
FD_SET(nRemoteSock,&fdset);

/* ②准备超时时间 */
wait.tv_sec=60;
wait.tv_usec=0;
/* ③调用select,检查返回 */
nMaxSock = (nLocalSock > nRemoteSock ? nLocalSock : nRemoteSock);
select(nMaxSock+1,&fdset, NULL, NULL, &wait);

有高手能指出,当套接字nLocalSock或nRemoteSock得值达到 1024的时候
select出错返回-1,errno=0, perror显示为 Invalid argument 错误
默认进程允许打开的最大文件数已经由256修改成16384 了。

C高手在哪里?这里有C高手吗?
...全文
402 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamesontan 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 lin_style 的回复:]
引用 15 楼 jamesontan 的回复:
第一
宏的处理FD_XXX需要扩展 ,请问如果扩展?扩展成什么样子?
第二
sys/type.h里的FD_SETSIZE值需要改变
阁下说的是 sys/types.h吧?这里面没有FD_SETSIZE 哦
但是 sys/select.h 里面有

第三
也是最重要的,内核需要重新编译
重新编译内核是需要很大的勇气的

不过行家就是行家,思路很清晰!


怎么改忘记了,不过只要将FD_的宏扩展拿出来看下不会很难。

这个…


[/Quote]

你这个思想很内行,我已经改用poll,问题解决,poll是个好东西,效率高多了
solaris上有成千的用户应用 重新编译内核,风险太大,呵呵,结账喽
大写的池 2008-09-15
  • 打赏
  • 举报
回复
飘过...
ForestDB 2008-09-15
  • 打赏
  • 举报
回复
去查查solaris 10 sprac下如何改变这个限制吧.
lin_style 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jamesontan 的回复:]
第一
宏的处理FD_XXX需要扩展 ,请问如果扩展?扩展成什么样子?
第二
sys/type.h里的FD_SETSIZE值需要改变
阁下说的是 sys/types.h吧?这里面没有FD_SETSIZE 哦
但是 sys/select.h 里面有

第三
也是最重要的,内核需要重新编译
重新编译内核是需要很大的勇气的

不过行家就是行家,思路很清晰!
[/Quote]

怎么改忘记了,不过只要将FD_的宏扩展拿出来看下不会很难。

这个值可能会依据系统不同有点偏差,所以在sys/select.h也正常

在linux下确实要重新编译内核。

额外话:select能用到这么大,楼主可要仔细考虑下效率哦。。
jamesontan 2008-09-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Arthur_ 的回复:]
引用 11 楼 jamesontan 的回复:
引用 5 楼 Arthur_ 的回复:
linux 的select支持的欠套字是1024,

你修改的是进程和这个无关吧。

超过1024要使用完成端口


呵呵,请问如何使用完成端口?
close?


难道你提问之前不google吗?
[/Quote]

写程序的有几个不google?

google能找到所有问题的答案嘛?
jamesontan 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lin_style 的回复:]
默认进程允许打开的最大文件数已经由256修改成16384 了

首先要改两个地方

第一
宏的处理FD_XXX需要扩展

第二
sys/type.h里的FD_SETSIZE值需要改变

第三
也是最重要的,内核需要重新编译

具体参考书籍 <unp> p155

英文原话如下

Changing the value without recompiling the kernel is inadequate
[/Quote]
第一
宏的处理FD_XXX需要扩展 ,请问如果扩展?扩展成什么样子?
第二
sys/type.h里的FD_SETSIZE值需要改变
阁下说的是 sys/types.h吧?这里面没有FD_SETSIZE 哦
但是 sys/select.h 里面有

第三
也是最重要的,内核需要重新编译
重新编译内核是需要很大的勇气的

不过行家就是行家,思路很清晰!
星羽 2008-09-13
  • 打赏
  • 举报
回复
up 一下
jamesontan 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iamliadai 的回复:]
这不是c的问题
[/Quote]
呵呵,行家,不是C本身问题,算我说错,抱歉。
既然是c程序调用该函数出现的问题,就当是C问题嘛
修改系统别的参数?
jamesontan 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gezichong 的回复:]
http://blog.vckbase.com/bastet/archive/2007/06/08/21533.html
http://hi.baidu.com/it_new/blog/item/701294242232a135c9955959.html

应该是受到FD_SETSIZE的限制
[/Quote]
请问如何突破该限制?
jamesontan 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Arthur_ 的回复:]
linux 的select支持的欠套字是1024,

你修改的是进程和这个无关吧。

超过1024要使用完成端口
[/Quote]

呵呵,请问如何使用完成端口?
close?
潇湘秦 2008-09-13
  • 打赏
  • 举报
回复
頂一下 學習學習
K行天下 2008-09-13
  • 打赏
  • 举报
回复
up
e_sharp 2008-09-13
  • 打赏
  • 举报
回复
UP
Arthur_ 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jamesontan 的回复:]
引用 5 楼 Arthur_ 的回复:
linux 的select支持的欠套字是1024,

你修改的是进程和这个无关吧。

超过1024要使用完成端口


呵呵,请问如何使用完成端口?
close?
[/Quote]

难道你提问之前不google吗?
gezichong 2008-09-12
  • 打赏
  • 举报
回复
http://blog.vckbase.com/bastet/archive/2007/06/08/21533.html
http://hi.baidu.com/it_new/blog/item/701294242232a135c9955959.html

应该是受到FD_SETSIZE的限制
OenAuth.Core 2008-09-12
  • 打赏
  • 举报
回复
select支持的SOCKET是1024

不过你的题目,很晕。可能水平有限,帮顶。等高手来
lin_style 2008-09-12
  • 打赏
  • 举报
回复
默认进程允许打开的最大文件数已经由256修改成16384 了

首先要改两个地方

第一
宏的处理FD_XXX需要扩展

第二
sys/type.h里的FD_SETSIZE值需要改变

第三
也是最重要的,内核需要重新编译

具体参考书籍<unp> p155

英文原话如下

Changing the value without recompiling the kernel is inadequate


cattycat 2008-09-12
  • 打赏
  • 举报
回复
去linux那问,肯定有人解决,帮你顶一下吧。
帅得不敢出门 2008-09-12
  • 打赏
  • 举报
回复
有点晕呼呼的.
Arthur_ 2008-09-12
  • 打赏
  • 举报
回复
linux 的select支持的欠套字是1024,

你修改的是进程和这个无关吧。

超过1024要使用完成端口
加载更多回复(4)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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