完全实现linux下SOCKET连接断开判断

原文在这里:http://bbs.chinaunix.net/thread-930153-1-1.html


link: http://libsbase.googlecode.com/svn/trunk/0.0.2/netcheck-0.0.3.tar.gz


  1. /* Net check Make sure you have not used OUT OF BAND DATA AND YOU CAN use OOB */
  2. int netcheck(int fd) 
  3. {
  4.         int buf_size = 1024;
  5.         char buf[buf_size];
  6.         //clear OOB DATA 
  7.         recv(fd, buf, buf_size);
  8.         if(send(fd, (void *)"\0", 1, MSG_OOB) < 0 )
  9.         {
  10.                 fprintf(stderr, "Connection[%d] send OOB failed, %s", fd, strerror(errno));
  11.                 return -1;
  12.         }
  13.         return 0;
  14. }
复制代码

  1. /* Setting SO_TCP KEEPALIVE */
  2. //int keep_alive = 1;//设定KeepAlive
  3. //int keep_idle = 1;//开始首次KeepAlive探测前的TCP空闭时间
  4. //int keep_interval = 1;//两次KeepAlive探测间的时间间隔
  5. //int keep_count = 3;//判定断开前的KeepAlive探测次数
  6. void set_keepalive(int fd, int keep_alive, int keep_idle, int keep_interval, int keep_count)
  7. {
  8.         int opt = 1;
  9.         if(keep_alive)
  10.         {
  11.                 if(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
  12.                                         (void*)&keep_alive, sizeof(keep_alive)) == -1)
  13.                 {
  14.                         fprintf(stderr, 
  15.                                 "setsockopt SOL_SOCKET::SO_KEEPALIVE failed, %s\n",strerror(errno));
  16.                 }
  17.                 if(setsockopt(fd, SOL_TCP, TCP_KEEPIDLE,
  18.                                         (void *)&keep_idle,sizeof(keep_idle)) == -1)
  19.                 {
  20.                         fprintf(stderr,
  21.                                 "setsockopt SOL_TCP::TCP_KEEPIDLE failed, %s\n", strerror(errno));
  22.                 }
  23.                 if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,
  24.                                         (void *)&keep_interval, sizeof(keep_interval)) == -1)
  25.                 {
  26.                         fprintf(stderr,
  27.                                  "setsockopt SOL_tcp::TCP_KEEPINTVL failed, %s\n", strerror(errno));
  28.                 }
  29.                 if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,
  30.                                         (void *)&keep_count,sizeof(keep_count)) == -1)
  31.                 {
  32.                         fprintf(stderr, 
  33.                                 "setsockopt SOL_TCP::TCP_KEEPCNT failed, %s\n", strerror(errno));
  34.                 }
  35.         }
  36. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值