LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1082|回复: 6

请问如何判断ppp链接的活性?

[复制链接]
发表于 2006-9-20 11:05:22 | 显示全部楼层 |阅读模式
我用ppp拨号(普通56K)。
没有选择断线重连。

拨号成功后我把电话线拔了,大约1分钟后pppd进程和ifconfig里的ppp0才消失。

但是如果我选择断线重连,拔电话线后两三秒钟,modem就有重新拨号的冲动。

我想用自己的断线检测程序,那么问题是,如何有效判定ppp链接的活性呢?
发表于 2006-9-20 12:11:40 | 显示全部楼层
以前做实验时用一个与手机功能相同的射频模块做这种拨号,当时我在程序中判断拨号是否建立的方法是检测以下几个文件,这是我通过比较拨号前后的文件系统来得到的,不一定精确,也不一定适用于 PC

  1. /var/run/ppp0.pid
  2. /proc/sys/net/ipv4/conf/ppp0
  3. /proc/sys/net/ipv4/neigh/ppp0
  4. /sys/class/net/ppp0      /* 这一个不知道是否一定会出现 */
复制代码

当时我是用 pppd 来拨号的。你也可以看看断线后
  1. ps -A | grep [p]ppd >/dev/null 2>&1
复制代码

的输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-20 12:23:40 | 显示全部楼层
Thank you VERY much again.

我明白你的意思。
我也是这么想的,我看的/var/lock/***(有一个是pppd的进程ID锁)

问题就是,当我拨号成功拔掉电话线后,所有的这些要一/两分钟后才消失……

估计还是软猫驱动的原因。

换了块硬猫,用同样的配置,只要一断线,几乎立刻就重播。

这个就比较麻烦了。
回复 支持 反对

使用道具 举报

发表于 2006-9-20 12:32:06 | 显示全部楼层
那看来就不太好办了。我没用过软猫,不了解。

由<参与>状态转为<关注>状态
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-20 12:39:31 | 显示全部楼层
THANK THEE very MUCH!!  

^_^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-21 16:55:56 | 显示全部楼层
还是没有好办法,写了一个很烂的code,放在cron里,一分钟运行一次……
[php]
#!/usr/bin/python
#Filename:checkLink.py

import os,time
from socket import *

#FODDER = ('www.waven.com',80)
FODDER = ('82.165.144.41',80)
LOCK = '/root/lock.chklive'

class CheckLink:
        def __init__(self):
                self.MAXRETRY = 2
                self.RESULT = 0  #0 for OK, -1 for error
               
                self.sfd = socket(AF_INET,SOCK_STREAM)
                self.sfd.settimeout(1.5)
                self.checking_tcp()
                self.process()

        def checking(self):
                for i in range(self.MAXRETRY):
                        err = os.system("ping 82.165.144.41-c 1 -W 2")
                        if err == 0:
                                return 0
                        else:
                                print str(i+1) + ' times ERROR!'
                self.RESULT = -1

        def checking_tcp(self):
                for i in range(self.MAXRETRY):
                        try:
                                self.sfd.connect(FODDER)
                                print 'connected OK! Link alive!'
                                self.sfd.close()
                                return 0
                        except:
                                print str(i+1) + ' times ERROR!'
                                pass
                self.RESULT = -1
       
        def process(self):
                if self.RESULT == 0:
                        print 'I am so happy.Link is survival.'
                else:
                        print 'Link down?  I must dial again..'
                        self._process_redial()
       
        def _process_redial(self):
                print 'redialing up.....'
                try:
                        open(LOCK)
                        print 'still dialing..pass'
                except:
                        #first dial
                        file(LOCK,'w')
                        os.system('/usr/bin/killall -9 pppd;echo "ATZ" > /dev/modem;/usr/bin/pon')
                        time.sleep(25)
                        os.remove(LOCK)
                        if not self.checking():
                                _process_redial()


########################
#        main routine                #
########################
if __name__ == '__main__':
        run = CheckLink()

[/php]
回复 支持 反对

使用道具 举报

发表于 2006-9-21 17:44:30 | 显示全部楼层
写的不错 佩服搂主还有用猫的耐心
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表