socket select 未触发?

qingdujun
博客专家认证
2017-07-13 10:57:53
问题是,我从Wireshark上看到数据包已经到了网卡了。可是select未触发。


背景:
以下是测试过程。 我有2条Socket链接。

第1条Socket数据到了之后,select立即触发;
第2条Socket数据到了之后,Wireshark看到数据包已经到了,select未触发。
第1条Socket数据又来了.....所有网卡数据全部触发select。这时候所有数据都显示出来了。



select模型


unsigned __stdcall PoCManager::accept_forever_thread(void* context){
Manager* manager = (Manager*)context;
/// select模型
fd_set select_socket_fd_set;
int time_out = 3;
struct timeval tv = { 1L, 0L };
while (manager && manager->m_origin_socket_fd_set.fd_count > 0){
select_socket_fd_set = manager->m_origin_socket_fd_set;
int select_ret = select(0, &select_socket_fd_set, NULL, NULL, &tv);//select
//.....省略
}
}


fd_set


if (m_origin_socket_fd_set.fd_count <= 0){
FD_ZERO(&m_origin_socket_fd_set);
}
FD_SET(tcp_socket, &m_origin_socket_fd_set);

if (m_origin_socket_fd_set.fd_count <= 1 && !m_handle_thread[0]){
/*启动recv线程*/
m_handle_thread[0] = (HANDLE)_beginthreadex(NULL, 0, accept_forever_thread, this, 0, NULL);
}

...全文
479 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingdujun 2017-08-10
  • 打赏
  • 举报
回复
结帖。问题已解决。 使用EventSelect、IOCP都可以解决该问题。select与重叠I/O,一般情况下,无法主动发出通知。 http://blog.csdn.net/u012339743/article/category/7029837
羽毛乱发 2017-07-25
  • 打赏
  • 举报
回复
引用 12 楼 u012339743 的回复:
[quote=引用 11 楼 shengliz 的回复:] select模型,对于并发型数据有问题,流程式一般没有什么问题。
这句话,怎么理解? 我个人理解的话,就是select模型不适合做客户端。除非有办法通知select。 或许Eventselect模型是否可以?[/quote] 我可没有说不合适啊,这个要看应用场景的,应用场景决定你用哪一种。select 是去查询,Eventselect是底层通知,都可以的。
qingdujun 2017-07-24
  • 打赏
  • 举报
回复
引用 11 楼 shengliz 的回复:
select模型,对于并发型数据有问题,流程式一般没有什么问题。
这句话,怎么理解? 我个人理解的话,就是select模型不适合做客户端。除非有办法通知select。 或许Eventselect模型是否可以?
羽毛乱发 2017-07-24
  • 打赏
  • 举报
回复
select模型,对于并发型数据有问题,流程式一般没有什么问题。
qingdujun 2017-07-17
  • 打赏
  • 举报
回复
另外,顺便说明一下,tv时间设置——注意:每次while循环,都需要手动重置tv。 tv不应该写在while外面。因为select会修改它。
qingdujun 2017-07-17
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
tv 超时时间设短
这个方式,存在一定的问题。
zgl7903 2017-07-17
  • 打赏
  • 举报
回复
tv 超时时间设短
qingdujun 2017-07-17
  • 打赏
  • 举报
回复

 while (manager && manager->m_origin_socket_fd_set.fd_count > 0){
        select_socket_fd_set = manager->m_origin_socket_fd_set;
        int select_ret = select(0, &select_socket_fd_set, NULL, NULL, &tv);//select
               //.....省略
      }
问题找到了, m_origin_socket_fd_set 更新后, select_socket_fd_set 还是监听原来的旧数据。 那么,要如何主动通知select,让其不要阻塞了呢?
qingdujun 2017-07-15
  • 打赏
  • 举报
回复
引用 5 楼 arpnet99 的回复:
是否是多网卡,而且绑定了多网卡之一的具体IP
这个我不太清楚,电脑目前状况是。 win7 64bit + VM - CentOs 6.8 - CentOs 7 - xp Mini - xp Pro IP 我直接connect的是局域网里面一台 192.168.x.x 主机。 我的select模型是客户端。(我目前是作为客户端)。
这不是鸭头 2017-07-15
  • 打赏
  • 举报
回复
是否是多网卡,而且绑定了多网卡之一的具体IP
qingdujun 2017-07-15
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
检查返回值及 WSAGetLastError 错误代码
线程中 select 函数直接没触发,err_code 没法检测。像1楼这样的问题,可能是由于什么原因造成的?
zgl7903 2017-07-14
  • 打赏
  • 举报
回复
检查返回值及 WSAGetLastError 错误代码
qingdujun 2017-07-13
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
socket select函数的详细讲解
这个大概用法,基本上差不多。 以前也是用select给公司写的SDK已经用了大半年了,也没出现问题。 这次更新SDK适应公司的新平台,发现select出现如1楼的状况。
zgl7903 2017-07-13
  • 打赏
  • 举报
回复

18,356

社区成员

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

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