当前位置:  技术问答>linux和unix

在程序中如何判断一个socket链路在3分钟内没有收发任何信息?

    来源: 互联网  发布时间:2015-12-20

    本文导语:  在程序中如何判断一个socket链路在3分钟内没有收发任何信息? 在链路有读写时, 在read或write之前或之后设置一个全局标志位代表 链路忙, 然后用一个检测线程这个标志位(检测线程每隔3分钟检测一下 这个标志位) 不...

在程序中如何判断一个socket链路在3分钟内没有收发任何信息?

在链路有读写时, 在read或write之前或之后设置一个全局标志位代表
链路忙, 然后用一个检测线程这个标志位(检测线程每隔3分钟检测一下
这个标志位)

不知道这种办法是否可行? read或者write的阻塞(假设长时间读不到或
写不到数据)会不会使这种办法失效?

|
使用select. 设置超时时间

|
你的方法明显不可行,要是在第2分钟就有数据了,但恰恰在第3分钟没数据呢?

|
使用select. 设置超时时间

|
select的写集合是表明可写,而不是写的动作的发生,因此觉得用select判断socket是否发了数据是不可行的

当有数据送往socket,应用程序并不一定立即读取,所以从应用程序角度看,并不能表示收取动作的完成,但是此时整个socket层下面的数据收取是完成了的


|
像keepalive报文哈

一个简单思路,用非阻塞socket,设置timer的值,写和读之前用select判断一下可写可读性,然后再进行读写操作,读写成功后修改timer值。
调度间隙或单独线程检查timer,当超时时发送keepalive报文过去;

p.s.这种应用应该比较多,lz可以看下其他协议是怎么编的,应该有更好的模式

|
顶jason69s().
   存活包.可以判断链路正常是不是通的.
   select超时判断就可以了..

|
不要用什么信号的,直接select搞定问题,何必要绕路解决问题呢,
学习信号的时候自然会了解信号适合的地方

|
自己写一个结构:
typedef struct my_sock
{
    int sock;
    int time;
}MY_SOCK;

每次sock有活动就置time=0,每次select后都检查time是不是超时不就行了?

|
可以同时设到select的read_fd和write_fd集合中

套接口准备好写的三个条件:
1,套接口发送缓冲区中的可用空间字节数大于等于2048(默认值)等。
2,对方shutdown写
3,套接口出错。

>>>这样如果我这边写socket的话, select也可以立即返回??
如果满足上面的条件,你不写也返回。

|
直接用超时信号即可解决问题。

|
OK,现在你可以用pselect去代替select.其中的 
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
     struct timeval *timeout);
int   pselect(int   n,   fd_set   *readfds,  fd_set  *writefds,  fd_set
       *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);

当sigset_t* 设置成NULL的时候就和select一样的.
timeval和timespec就是时间级别不一样,一个百万,一个十亿份之一秒.
man pselect吧.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 请教,在linux下如何判断程序的内存泄露?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 请问,如何用程序判断一个用ftp传输的文件已经完成?
  • 程序如何动态检测USB硬盘的插入及如何判断有几个分区
  • 菜鸟请教,应用程序如何判断驱动程序已经挂载成功
  • 请教:在程序中创建文件夹,应该用什么函数?怎么判断文件夹存不存在呢?
  • ScoOpenServer下的进程产生core,如何判断是哪个程序产生的?
  • 用程序如何判断主板上是双网卡还是单网卡呢?
  • 在linux下用程序如何判断出主板是什么芯片组?
  • 如何判断一个程序后台执行
  • 如何在在一个程序中判断另一个程序是否已运行?是哪个命令或函数?
  • 请问如何在qt程序中判断当前的操作系统和环境??
  • 求教:给你一个程序,怎样判断它用到了哪些库
  • linux程序如何判断一个网络共享文件是否更新
  • 程序里如何判断光驱里的是DVD盘,还是CD盘,还是一般的CD数据盘
  • linux 下如何取出一个分区的类型(不是查看而是要在我的程序中判断出来)
  • linux编写一个脚本判断程序是否在运行,如果没运行就重启这个软件。
  • 无法终止程序, 条件判断出问题 ,奇怪
  • 支持Bash的OnlineJudge,在线判断程序对错。
  • gtk 如何判断一个程序是否执行了?
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • windows server2008上PowerBuilder程序系统错误解决方法
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • 程序员的八种级别,你属于哪一级?
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • 在docker容器中通过apt-get安装新的程序
  • 我的程序是用c写的gtk+程序,有个函数的参数要传给它图片的文件名,但是图片和原程序不在同一目录下怎么办?怎么在程序里指定文件的路径


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3