--------windows里的select,如果SET里的套接字没有数据,select返回后会被自动删除。。为什么这么别扭呢?为什么要删除呢?为什么!!??

lin_style 2010-02-03 02:43:58
代码就不贴了。

附上网上的一个连接

http://hi.baidu.com/programpad/blog/item/2151751e8b4698fde1fe0b5d.html


为什么呢??感觉非常不爽。还是我使用方法不对?
...全文
95 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_style 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ilysony 的回复:]
引用 12 楼 lin_style 的回复:
引用 10 楼 ilysony 的回复:
引用 9 楼 lin_style 的回复:
  用副本不行。
  说明你没看FD的宏实现
  FD_CLR是按移动数组紧凑方式,然后修改fd_count
  FD_ZERO是直接修改fd的fd_count变量

  fd_count不符如何做副本拷贝? 自己修改的话明显更不合适。不可避免的进行一次重新的set宏


  你自己理解不了, 还要说别人不行? 宏我看不明白都懂,你这么牛B还不懂?


我在11楼承认我错了。


副本是最简单的方式, 可能也是大家第一个想到的办法。

当然办法有很多种, 楼主你可以选择你认为最优的。
[/Quote]

好的,谢谢。刚才我有点冲动,不好意思。
Sou2012 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lin_style 的回复:]
引用 10 楼 ilysony 的回复:
引用 9 楼 lin_style 的回复:
用副本不行。
  说明你没看FD的宏实现
  FD_CLR是按移动数组紧凑方式,然后修改fd_count
  FD_ZERO是直接修改fd的fd_count变量

  fd_count不符如何做副本拷贝? 自己修改的话明显更不合适。不可避免的进行一次重新的set宏


你自己理解不了, 还要说别人不行? 宏我看不明白都懂,你这么牛B还不懂?




我在11楼承认我错了。
[/Quote]

副本是最简单的方式, 可能也是大家第一个想到的办法。

当然办法有很多种, 楼主你可以选择你认为最优的。
lin_style 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ilysony 的回复:]
引用 9 楼 lin_style 的回复:
用副本不行。
说明你没看FD的宏实现
FD_CLR是按移动数组紧凑方式,然后修改fd_count
FD_ZERO是直接修改fd的fd_count变量

fd_count不符如何做副本拷贝? 自己修改的话明显更不合适。不可避免的进行一次重新的set宏




你自己理解不了, 还要说别人不行? 宏我看不明白都懂,你这么牛B还不懂?


[/Quote]

我在11楼承认我错了。
lin_style 2010-02-03
  • 打赏
  • 举报
回复
不好意思,9楼我说错了。 拷贝可以。
但是很别扭,灵活性不高。比如,select后的代码中可能要删除(关闭)掉某些套接字,再回头循环开头的副本拷贝,有很多未知情况。我采取了另外的set的方法。
Sou2012 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lin_style 的回复:]
用副本不行。
说明你没看FD的宏实现
FD_CLR是按移动数组紧凑方式,然后修改fd_count
FD_ZERO是直接修改fd的fd_count变量

fd_count不符如何做副本拷贝? 自己修改的话明显更不合适。不可避免的进行一次重新的set宏


[/Quote]

你自己理解不了, 还要说别人不行? 宏我看不明白都懂,你这么牛B还不懂?

lin_style 2010-02-03
  • 打赏
  • 举报
回复
用副本不行。
说明你没看FD的宏实现
FD_CLR是按移动数组紧凑方式,然后修改fd_count
FD_ZERO是直接修改fd的fd_count变量

fd_count不符如何做副本拷贝? 自己修改的话明显更不合适。不可避免的进行一次重新的set宏

hurryboylqs 2010-02-03
  • 打赏
  • 举报
回复
为什么需要再次set进去?
可见你并没理解嘛,写一段代码给你就明白了


fd_set fdSocket;
FD_ZERO(&fdSocket);
for (int i=0;i<100;i++)
{
SOCKET hSock = socket(AF_INET,SOCK_STREAM,0);
if (hSock!=INVALID_SOCKET)
{
FD_SET(hSock, &fdSocket);
}
}

timeval tm;
int nRet;
while(true)
{
fd_set fdRead = fdSocket;//用副本(这里只简单的执行内存拷贝)
tm.tv_sec = 2;
tm.tv_usec = 0;
nRet = ::select(0,&fdRead,NULL,NULL,&tm);
if(nRet>o)
{
for(int i=0;i<fdRead.fd_count;i++)
{
nRet = recv(fdRead.fd_arry[i],...);
}
}
}
Sou2012 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lin_style 的回复:]
引用 5 楼 hurryboylqs 的回复:
引用 4 楼 lin_style 的回复:
select只是负责set里面数据的检测,怎么能随便删除掉?那我每次select不是都要重新设置一回集合?

不删除掉那你打算怎么样?还继续保留在集合里?
参数是 【in, out】的
传递进去一个集合然后传出,并返回事件受信的个数
那么你下来一个for:0 - n-1循环就处理掉了
如果你不剔除那你处理更麻烦了,每次都得做很多无用功
比如100个只有1个受信,那么你也得徒劳的循环100次
而这里只需一次循环处理



那再次select的时候,不是照样要set这100个进去,FD_SET宏里面是个逐个判断的,复杂度是1+2+3...99, 那个高?那个低??

附FD_SET代码
C/C++ code#define FD_SET(fd, set) do { \
u_int __i; \for (__i=0; __i< ((fd_set FAR*)(set))->fd_count; __i++) { \if (((fd_set FAR*)(set))->fd_array[__i]== (fd)) { \break; \
} \
} \if (__i== ((fd_set FAR*)(set))->fd_count) { \if (((fd_set FAR*)(set))->fd_count< FD_SETSIZE) { \
((fd_set FAR*)(set))->fd_array[__i]= (fd); \
((fd_set FAR*)(set))->fd_count++; \
} \
} \
}while(0)
[/Quote]

多写一个变量保存副本不就得了
lin_style 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hurryboylqs 的回复:]
引用 4 楼 lin_style 的回复:
select只是负责set里面数据的检测,怎么能随便删除掉?那我每次select不是都要重新设置一回集合?

不删除掉那你打算怎么样?还继续保留在集合里?
参数是 【in, out】的
传递进去一个集合然后传出,并返回事件受信的个数
那么你下来一个for:0 - n-1循环就处理掉了
如果你不剔除那你处理更麻烦了,每次都得做很多无用功
比如100个只有1个受信,那么你也得徒劳的循环100次
而这里只需一次循环处理

[/Quote]

那再次select的时候,不是照样要set这100个进去,FD_SET宏里面是个逐个判断的,复杂度是1+2+3...99, 那个高?那个低??

附FD_SET代码
#define FD_SET(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \
break; \
} \
} \
if (__i == ((fd_set FAR *)(set))->fd_count) { \
if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
((fd_set FAR *)(set))->fd_array[__i] = (fd); \
((fd_set FAR *)(set))->fd_count++; \
} \
} \
} while(0)
hurryboylqs 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lin_style 的回复:]
select只是负责set里面数据的检测,怎么能随便删除掉?那我每次select不是都要重新设置一回集合?
[/Quote]
不删除掉那你打算怎么样?还继续保留在集合里?
参数是 【in, out】的
传递进去一个集合然后传出,并返回事件受信的个数
那么你下来一个for:0 - n-1循环就处理掉了
如果你不剔除那你处理更麻烦了,每次都得做很多无用功
比如100个只有1个受信,那么你也得徒劳的循环100次
而这里只需一次循环处理
lin_style 2010-02-03
  • 打赏
  • 举报
回复
select只是负责set里面数据的检测,怎么能随便删除掉?那我每次select不是都要重新设置一回集合?
lin_style 2010-02-03
  • 打赏
  • 举报
回复
我举个例子:

假如我现在是用select+超时的。然后超时返回,套接字没有收到数据,select就把我删除了。这合理吗?只是没数据为什么就把我删除了??
Sou2012 2010-02-03
  • 打赏
  • 举报
回复
就把比如说 POLICE 要在20个人里找出罪犯,

不是罪犯的人就删除了

剩下的不就是罪犯了么
hurryboylqs 2010-02-03
  • 打赏
  • 举报
回复
什么别扭?没理解原理?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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