免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3358 | 回复: 3

[C] 关于在thread中使用select的问题 [复制链接]

论坛徽章:
0
发表于 2009-04-26 21:11 |显示全部楼层
10可用积分
最近写一个长连接的转发程序,由于要转发多路长连接句柄,故决定采用线索方式,一个线索处理收发用的两个句柄,由于同时要处理从客户端到服务端的转发和服务端到客户端的转发,故在每个线索中使用select来决定转发的方向。

在此期间遇到了两个问题:
1、使用netstat查看接口状态中发生接收队列的拥堵情况,虽然能看到lisener在端口监听,但是accept无法产生新的连接。
2、通讯时断时续。

伪代码实现如下:

主线索
  使用listen产生监听socket;
  for(;;) {
         accept等待client端连接;
      有新连接,产生新线索(传入新socket id);
  }

子线索
  for(; {
         产生到server端的连接句柄;
         select检查两个句柄是否有信息;
      如果是server端句柄来 {
             接收server端数据;
         转发到client端;
         }
         如果是client端句柄来 {
             接收client数据;
         转发到server端;
         }
   }
   考虑到有client端或server端处理时有新消息转发的情况,故使用的是recv函数进行接收。但是还是会发生上述的情况。最后将select函数去除,只提供从client端到server端的转发后,问题就没有了,是否是select函数不能同时在多个线索中使用呢?请指正,谢谢。

论坛徽章:
0
发表于 2009-04-26 21:26 |显示全部楼层

回复 #1 zhangych 的帖子

子线程中到server端的连接是怎么产生的呢? 是在子线程开始运行以后, 进入for循环以前connect到server上的吗(应该用的是TCP没错吧)?
该不会是所有子线程共用一条到server的连接吧......?

select在多个线程中使用没有问题, 但是这多个线程要是select相同的fd可能就有问题了...

[ 本帖最后由 kouu 于 2009-4-26 21:34 编辑 ]

论坛徽章:
0
发表于 2009-04-27 21:59 |显示全部楼层
不会啊,你使用connect去连接server时会建立一个单独的session和使用的sockfd啊

论坛徽章:
0
发表于 2009-04-28 08:58 |显示全部楼层
对于转发类的程序,最容易出现的就是队列阻塞情况。

建议你增加缓冲机制,能发多少发多少,暂时发不出去的缓存起来,慢慢发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP