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

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

附上网上的一个连接

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


为什么呢??感觉非常不爽。还是我使用方法不对?
...全文
118 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
  • 打赏
  • 举报
回复
什么别扭?没理解原理?
内容概要:本文围绕基于下垂系数功率分配的双机并联虚拟同步发电机(VSG)微电网黑启动控制开展研究,重点利用Simulink仿真平台构建系统模型,实现微电网在无外部电网支撑条件下的自主启动与稳定运行。研究通过引入VSG技术模拟同步发电机的惯性和阻尼特性,结合下垂控制策略实现双机并联系统在黑启动过程中的有功与无功功率协调分配,有效抑制电压频率波动和功率振荡问题。文中详细阐述了控制系统的架构设计、核心控制环路的实现方式、关键参数的整定方法,并通过仿真结果验证了所提出控制策略在动态响应、负载突变及系统恢复等方面的优越性能,为提升微电网的自主恢复能力与供电可靠性提供了有效的技术路径。; 适合人群:具备电力系统、电力电子与自动控制等相关专业知识背景,熟悉Simulink/MATLAB仿真环境,从事微电网、分布式能源系统、VSG控制等领域研究的科研人员、高校教师及硕士、博士研究生。; 使用场景及目标:①深入理解虚拟同步发电机(VSG)的工作原理及其在黑启动中的应用价值;②掌握基于下垂控制的双机并联系统功率均分与稳定控制技术;③构建完整的微电网黑启动仿真模型,服务于科研论文撰写、课题申报、实验教学或工程预研。; 阅读建议:此资源以仿真为核心手段,建议读者在学习过程中结合理论分析,动手搭建Simulink模型,逐步调试控制器参数,深入探究下垂系数、虚拟惯量等关键参数对系统动态性能的影响,并可进一步拓展至多机并联、含储能单元或复杂负载工况的场景进行深化研究。

18,357

社区成员

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

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