我学习socket编程还处于初级阶段,最近被select困扰了很久,有个问题与大家讨论。
我原来的用法是在一个线程中反复select查询socket状态:
while (pDlg->m_bGo)
{
status = select(0,&m_ReadFds,NULL,NULL,&timeout);
switch(status)
{
case SOCKET_ERROR:
break;
case 0:
break;
default:
if (FD_ISSET(m_Socket,&m_ReadFds))
{
}
break;
}
}
遇到的问题是第一次能成功select,循环到第二次select就发生SOCKET_ERROR,错误代码10022(Invalid argument)。调试发现第二次循环走过select后,m_ReadFds.fd_count等于0,推断是此线程之外的其他某个操作造成这样的异常。在排除了任何其他可能后,最终确定敏感事件集FD_SET需要在每次select之前都设置一次,而不是设置一次后select多次。也就是插入一行:
while (pDlg->m_bGo)
{
FD_SET(m_Socket,&m_ReadFds);
status = select(0,&m_ReadFds,NULL,NULL,&timeout);
switch(status)
……
}
为什么socket要设计成这样一种模式?我觉得完全可以第一次设置敏感事件集FD_SET,以后不再需要维护,这样不是能节省一些开销吗?对此处的设计原理有些不解。
我原来的用法是在一个线程中反复select查询socket状态:
while (pDlg->m_bGo)
{
status = select(0,&m_ReadFds,NULL,NULL,&timeout);
switch(status)
{
case SOCKET_ERROR:
break;
case 0:
break;
default:
if (FD_ISSET(m_Socket,&m_ReadFds))
{
}
break;
}
}
遇到的问题是第一次能成功select,循环到第二次select就发生SOCKET_ERROR,错误代码10022(Invalid argument)。调试发现第二次循环走过select后,m_ReadFds.fd_count等于0,推断是此线程之外的其他某个操作造成这样的异常。在排除了任何其他可能后,最终确定敏感事件集FD_SET需要在每次select之前都设置一次,而不是设置一次后select多次。也就是插入一行:
while (pDlg->m_bGo)
{
FD_SET(m_Socket,&m_ReadFds);
status = select(0,&m_ReadFds,NULL,NULL,&timeout);
switch(status)
……
}
为什么socket要设计成这样一种模式?我觉得完全可以第一次设置敏感事件集FD_SET,以后不再需要维护,这样不是能节省一些开销吗?对此处的设计原理有些不解。
解决方案 »
- 请教CLSIDFromProgID的问题
- 驱动如何获取芯片的ID
- VC++ 6.0 和USB的通信 我用SetupDiEnumDeviceInterfaces函数来获取USB设备总是返回失败?
- DLL 头文件声明出错
- 问个问题:关于树控件的??谢谢
- OLE DB的一个问题!
- URLDownloadToFile()花了我很长的时间,如何提前判断?
- 已经包含了头文件,怎么还提示错误?
- 人要悖起来,喝凉水都塞牙
- 帮个忙啊,有没有好的关于拓扑绘制算法啊.我现在知道节点和节点之间的连接.怎么让拓扑绘制的时候,节点之间的连线不交叉呢.
- 请问如果识别图片中的数字,谢谢
- 距离端午节结束还剩15分钟,你还没吃粽子吗?
可能是windows有它自己专门的高性能网络模式。
具体也不是特别清楚,呵呵
权当抛砖引玉了。
因此它的返回结果必须用集合来实现,也就是说每次必须将感兴趣的SOCKET添加到这个集合中你这里的情况只是对一个SOCKET进行查询,可以改用WSAEventSelect来查询
是的,有的时候我们并没有窗口,所以这部分功能就浪费了。
我的本意是模拟WSAEventSelect的功能,定制自己的接口。