ppp拨号导致看门狗复位

之前在淘宝网上买了3G的无线上网数据卡,USB接口的,分别是移动和电信的,刚买来的时候是可以拨号上网的,过了几个月后就不能拨号上网了,不知道是不是移动或者电信有什么限制;然后又在网上买来sim900a gprs模块进行测试,通过usb转串口芯片cp2102调试gprs模块sim900a的时候,发现拨号到一半的时候,系统就重启了,经过多次测试终于解决了,原来时ppp拨号的时候导致一个喂狗线程没有能够喂狗,从而导致系统复位,把看门狗关闭后就可以正常拨号了,后续进一步分析这个原因并解决它(也可能是gprs模块拨号的时候电流过大将3.3v电压拉跨导致核心板服务,因为3.3v电压输出部分没有加大的储能电容)。

同时还做了下面的调整:

 

1、设置DNS地址

/etc/ppp 下会由拔号自动产生resolv.conf 文件, 但它和 /etc/resolv.conf 并不是同一个文件,所以有的时候不能解析DNS。一个好办法是,首先保证存在/etc/resolv.conf, 然后在/etc/ppp下创建软链接ln -s /etc/ppp/resolv.conf /etc/resolv.conf这样在拔号成功后,在/etc/resolv.conf中会有类似以下内容:

nameserver 218.201.96.130

nameserver 211.137.191.26

 

2、关于Linux使用pppd拨号,自动断网,重新拨号功能 

 脚本如下:auto_pppd.sh

#!/bin/sh

while true;do

    ping -w1 news.sina.com.cn >/dev/null 2>&1 || ( killall pppd; date; pppd call ls-gprs &)

   sleep 20  #每20秒检测一次

done

 可以放在开机脚本

auto_pppd.sh

#!/bin/sh

#扩展

#

 

dns1="211.95.193.97"

dns2="211.136.20.203"

 

sleep 8

/bin/pppd call gprs-siem &

sleep 12

while true

do      

       ping -s 1 -c 1 $dns1    ……去PING第一个DNS

       if [ "$?" != "0" ]      ……假如PING不通

       then

           ping -s 1 -c 2 $dns2   ……去PING第二个DNS

           if [ "$?" != "0" ]     ……假如PING不通

           then   

              killall pppd         ……结束PPPD进程

              pppd call gprs-siem & ……再去拨号

              sleep 12               ……等待12秒

           else

              sleep 5            ……如果是PING  DNS2通的话就直接等待5秒

           fi   

       else

              sleep 5            ……如果是PING  DNS1通的话就直接等待5秒(一般要设置多长时间去PING请改这里)

 

       fi               

done

代码简明!!它相当于在后台时时去PING一个DNS发现真正地掉线,它才会去重新拨号!!此版本经测试通过才发表。

 

3、这里使用Unix网络编程里面的一个小程序,该客户端建立一个到服务器的TCP连接,然后读取由服务器以直观可读格式简单地送回的当前时间和日期,在程序里面分析时间服务器返回的数据格式,提取出uts时间格式,然后用c语言调用shell命令date -s设置linux系统时间。

代码如下:

#include "unp.h"

int main(int argc, char **argv)

{

int sockfd, n;

char recvline[MAXLINE + 1];

struct sockaddr_in servaddr;

if (argc != 2)

err_quit("usage: a.out <IPaddress>");

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

err_sys("socket error");

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(13); /* daytime server */

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)

err_quit("inet_pton error for %s", argv[1]);

 

if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)

err_sys("connect error");

 

while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {

recvline[n] = 0; /* null terminate */

if (fputs(recvline, stdout) == EOF)

err_sys("fputs error");

}

if (n < 0)

err_sys("read error");

exit(0);

}

如何在c程序中取得shell脚本中一个变量的值?(准备在c程序中去获取pppd拨号脚本中一个变量,然后在c程序中进行tcp重新连接)

1。将变量的值写到文件中,然后在c中去读。

2。将该变量export出来,在c中用getenv去读。

3。或者也可以考虑使用命名管道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值