免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2896 | 回复: 5
打印 上一主题 下一主题

多线程接收TCP带外数据的问题~~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-25 10:06 |只看该作者 |倒序浏览
程序模型是:C/S模式,S端监听C的连接,创建子线程去处理新连接,我想定时察看所有连接的连接状态,所以想利用TCP的带外数据探测所有子线程所在的连接的状态。现在两边的接收和发送带外数据的程序都做好了,就是C端主动每3秒向S发送一个OOB,S收到后向C返回一个OOB,经测试C端能正常发送和接收OOB,而S端只能正常发送,接收不到。后来查看资料才知道,线程之间是共享信号和处理函数的(我的信号SIGURG处理函数在各自的子线程中,当侦测到连路段开时,修改父进程全局数组来实现链路状态的管理的),不知道是不是因为多线程的原因?这种程序能用多线程实现吗?谢谢大家了~~~~~

论坛徽章:
0
2 [报告]
发表于 2005-02-25 12:25 |只看该作者

多线程接收TCP带外数据的问题~~~~

I got an idea, maybe it works, maybe not, but at least you can try it.

first I dont think this is a good design at all.
second, if you really want to do it this way, then maybe as I think, you can use select() in each thread as well as select in the main thread. in the main thread, the select() just wait for listening socket fd, which in each worker threads you just can select its own conn_sock_fd(, because select is not so thread safe).

for example, in each worker thread, you can use:

...
FD_SET(rset,conn_sock_fd);//read fd_set
FD_SET(xset,conn_sock_fd);//out_bound_message fd_set

if ( n = select ( maxfd, &rset, NULL, &xset,...) ...)
{
   ...
   /* if conn_sock_fd was set in xset , then read the OOB message here */
  ...
}


I do hope it works,
in any case, please let me know, OK?

论坛徽章:
0
3 [报告]
发表于 2005-02-25 12:31 |只看该作者

多线程接收TCP带外数据的问题~~~~

sorry for some mistakes up there with FD_SET.

论坛徽章:
0
4 [报告]
发表于 2005-02-25 12:41 |只看该作者

多线程接收TCP带外数据的问题~~~~

谢谢了~~~我试一试~~~

论坛徽章:
0
5 [报告]
发表于 2005-02-25 12:57 |只看该作者

多线程接收TCP带外数据的问题~~~~

first I dont think this is a good design at all.
为什么不好呢?因为我的服务器一直处于被动通信的模式,要是client连接以后异常死机,我的server端根本不知道,处理这个client的子线程就一直等待。我觉得解决这种问题的解决方法有以下几个:
(1)使用KEEPALIVE套接口选项,但是要经过很长时间(大约是2个小时吧)才能探测到断开,修改了探测频率会影响其他所有OS的socket通信,而且KEEPALIVE的设计目的也不是为了这个用途
(2)使用TCP的带外数据,也就是我上面的做法,server与client按照一定频率互相发送OOB数据来保持链路的连通,如果在规定时间内没有收到带外数据就表示链路已经断开。使用OOB的好处是OS的协议栈帮我们实现了细节的处理,而且OOB数据可以使用与普通数据不同的接收缓冲区。
(3)自定义协议来保持连接,这种方法比较麻烦,因为探测数据和普通数据都是放在了TCP协议栈的接收缓冲区中,当recv的时候要区分这两种数据。
现在(3)的方法我已经实现了,想优化程序把探测模块变为方法(2)中的方法~~~~“柳五随风”大哥能告诉我还有什么其他的方法实现这种功能吗??我实在是想不出了,我个人觉得用OOB最好了~~~呵呵~~谢谢了~~

论坛徽章:
0
6 [报告]
发表于 2005-02-25 23:08 |只看该作者

多线程接收TCP带外数据的问题~~~~

OOB什么的主要是用来检测END到END的,要用来检测PEER到PEER没什么实际意义.系统开销太大,对OS的性能影响太大.
如果是我设计的话,我只会用OOB检测NODE到NODE的健康情况,对于每一个THREAD的连接情况,我首先人为在TCP层以上的应用是可以信赖的,在此基础上,如果我能检测到哪个SESSION使用的NODE到NODE的连接是不可信的时候,我会通过专门的Thread kill这个SESSION的工作THREAD为进一步确认系统安全,我会在管理THREAD里面强制RSTCLIENT的SESSION端,,释放该连接的资源(如果有的话).
个人一点观点而已.
另外,我很想知道你实验的怎么样了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP