linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux入门与提高 > 上网与多媒体 >
栏目导栏
资料搜索
热门文章
·Linux下安装QQ最简单的方法
·Linux下用QQ的两个方法
·Linux下玩QQ
·沸点电视监视播放器feidian-mo
·Realplay 10.0 的安装和使用
·Xmms---Linux下优秀的MP3播放器
·Linux操作系统Gaim玩转QQ MSN
·Linux桌面环境玩转BT
·Linux下玩游戏全攻略!满足你的
·FC5下安装配置XMMS mp3 Player
·Linux操作系统上LumaQQ 2006安
·Linux操作系统下媒体播放器的初
·linux多媒体
·让MPlayer成为Linux下的万能播
·Linux上的DVD播放器
最新文章
·Linux系统下Wine成功运行Bitco
·在Linux系统下使用wine运行迅雷
·在Linux操作系统下进行网通拨号
·Linux下OpenOffice.org安装3D效
·Fedora8系统Gnome桌面环境下安
·Ubuntu Linux 8.04蓝牙设备连接
·RHEL5系统服务器下GRE隧道的开
·教你如何在Linux操作系统下观看
·在SUSE Linux系统下安装ADSL上
·在Linux Debian操作系统下成功
·Linux操作系统下图形界面模式更
·Linux系统下建立GPRS无线Modem
·如何在RedHat Linux系统下安装
·在Linux终端中“\”和“--”所
·Linux操作系统下轻松刻录CD-RO
Google
 
北京中电飞华电力猫在Linux/Unix 下上网的解决方案
[ 作者:Linux联盟收集  加入时间:2006-07-09 00:50:17  来自:Linux联盟收集 ]
北京中电飞华电力猫在Linux/Unix 下上网的解决方案 77sLinux联盟
作者:马路遥 maluyao at 163.com 77sLinux联盟
77sLinux联盟
关键词:Linux Unix plc 电力猫 中电飞华 77sLinux联盟
77sLinux联盟
本文的内容和程序均以GPL 方式发布。 77sLinux联盟
77sLinux联盟
  中电飞华在北京推出了电力猫上网的业务,费用相当低廉。笔者选用的一款是400元包半年的套餐。标称速度是10M 实际下载可以达到60K以上,在北方网通的地盘上速度也算马马虎虎了。 77sLinux联盟
77sLinux联盟
  中电飞华提供了两种类型的"电力猫",一种用”网线型号“的,用网线直接接入电脑。相当于一个hub或交换机。不需要驱动程序都可以在任何操作系统上使用。另一种为usb接入。没有驱动不能在Linux下使用。但www.intellon.com以GPL的方式开放了windows下驱动程序的源代码。原则上也可以移植到linux/unix上。如果不愿做这个移植工作。建议使用linux/unix 的朋友一定要选择网线型号的电力猫。 77sLinux联盟
  北京地区的中电飞华在Windows 下采用的认证方式据说是华为认证。以IE + ActiveX的方式进行,无法移植到Linux/Unix上,其原理如下: 77sLinux联盟
1.在某个web服务器的cgi程序上进行认证,认证通过后你会得到一个sessionid 的变量。此变量实际使用中最大为31000,应该不会超过32767。这在Linux 下很容易做到。 77sLinux联盟
2.每分钟发送一个udp包到服务器的8090端口,其中包括上述的sessionid 数据。但服务器并不回应。这样连接会一直保持。 77sLinux联盟
通过ethereal 抓包分析出udp数据如下: 77sLinux联盟
数据长度为10个字节,以下以16进制表示: 77sLinux联盟
77sLinux联盟
05 05 00 00 00 00 00 00 61 54 77sLinux联盟
77sLinux联盟
第一个数据似乎一直不变。 77sLinux联盟
77sLinux联盟
第二个数字从零开始,每次会加一,由于两个16进制的长度最多能发256分钟,暂时还部知道256分钟以后此字段如何变化。事实上电力猫连接不甚稳定,也不容易达到这个数字。 77sLinux联盟
中间的6个字段总是0。 77sLinux联盟
最后两个字段的组合是sessionid 的值。 77sLinux联盟
比如你得到的sessionid 是29615 ,那么后两个就是73 AF 77sLinux联盟
29615=0x73AF. 77sLinux联盟
77sLinux联盟
注销时也是发一个udp包,内容和刚才相似,但头两位数据是 77sLinux联盟
03 0A 77sLinux联盟
我是包半年的用户。不用考虑注销的问题。 77sLinux联盟
77sLinux联盟
知道这些,就很容易实现Linux Unix下的认证了 77sLinux联盟
77sLinux联盟
先用写了个脚本(在同一行里) 77sLinux联盟
curl -s -d "username=MY_USER_NAME&password=MYPASSWORD&serviceID=0&webserviceID=0&tempID=0"http://211.160.92.162/login.cgi grep SessionID |grep VALUE |awk -F '=' '{print $3}' |awk -F '>' '{print $1}' 77sLinux联盟
77sLinux联盟
我把这个脚本命名为feihua.sh ,加上755 的权限,放到/usr/local/bin 里。当然要把MY_USER_NAME和MYPASSWORD换成自己的用户名和密码。 77sLinux联盟
77sLinux联盟
这个脚本的返回结果就是sessionid. 77sLinux联盟
用C语言写了下列程序。本人的C 语言比较菜。仅仅是对付能用.(程序名称为plc.c ,放在最后) 77sLinux联盟
gcc plc.c -o /usr/local/bin/plc 77sLinux联盟
77sLinux联盟
程序在Redhat AS4 上编译和运行都没问题,希望使用其他版本Linux 、FreeBSD以及其他Unix 的朋友们也帮我测试一下。 77sLinux联盟
77sLinux联盟
执行: 77sLinux联盟
fiehua.sh |plc 77sLinux联盟
77sLinux联盟
这样就可以成功认证了 77sLinux联盟
77sLinux联盟
后记: 77sLinux联盟
05末年装了个电力猫,这也是我所在小区宽带的唯一选择。因为多数用linux工作。很不爽。 77sLinux联盟
刚开始用crontab 调用curl 每分钟进行一次web 验证,虽然也能对付,但实在是不舒服。 77sLinux联盟
77sLinux联盟
因为怀疑所谓的华为认证是比较复杂的机制。也许还涉及到加密解密(现在想想,基本不可能实现)和其他的底层问题。 77sLinux联盟
决定从C语言入手,搞定这个问题。 77sLinux联盟
77sLinux联盟
  笔者的编程经验虽然可以追溯到18年前使用Fortran语言,java/perl/php/vb/shell 等都会,但都是业余水平。 77sLinux联盟
以前也自学过C,除了指针之外,基本都懂了。有点象只能使用机枪而不能使用大炮的坦克手。 77sLinux联盟
77sLinux联盟
在06年春节其间,为了学习C,从谭浩强到 K&R 的书都看了几遍。算是基本理顺了指针。 77sLinux联盟
但随后发现,为了彻底弄清楚C,先得看看数据结构。 77sLinux联盟
77sLinux联盟
又发现理解数据结构,还要研究离散数学。反正又大把的时间。索性就这么看下去。 77sLinux联盟
77sLinux联盟
又弄了几本Unix下C编程的书。这些该死的作者都把Socket编程放到最后。我还没看到呢。 77sLinux联盟
77sLinux联盟
拿出sniffer 抓一下包,才发现这么简单。早知道抄个java或perl程序,也许半个钟头就搞定了. 77sLinux联盟
77sLinux联盟
既然已经看了这么多C,下一步想把我本本上Ti 的读卡器、1394、pcmcia卡三合一芯片的Linux驱动搞定。这对我来说,估计是个复杂的工作了,希望在笔记本报废之前,能够完成这个工作。 77sLinux联盟
77sLinux联盟
暂时靠讲授Linux课程吃饭。勉强也能养家糊口,十年磨一剑,又如何. 77sLinux联盟
77sLinux联盟
77sLinux联盟
感谢南京的新梦网友在两年前(2004,那时候他还是高中生)提供的帮助和思路. 77sLinux联盟
77sLinux联盟
附C程序plc.c 77sLinux联盟
代码:
77sLinux联盟
//plc.c 77sLinux联盟
#include   <sys/socket.h> 77sLinux联盟
#include   <netinet/in.h> 77sLinux联盟
#include   <netdb.h> 77sLinux联盟
#include   <stdio.h> 77sLinux联盟
#include   <unistd.h> 77sLinux联盟
#define      FIRST 0 77sLinux联盟
#define      LAST 1 77sLinux联盟
int main(int argc,char *argv[]){ 77sLinux联盟
   char *host; 77sLinux联盟
   int sockfd; 77sLinux联盟
   int len,result; 77sLinux联盟
   struct sockaddr_in address; 77sLinux联盟
   struct hostent *hostinfo; 77sLinux联盟
   struct servent *servinfo; 77sLinux联盟
   char buffer[10]; 77sLinux联盟
   int   sid; 77sLinux联盟
   scanf("%d",&sid); //读入sessionid ,用管道读入就最简单了 77sLinux联盟
//   printf("sid is %d\n",sid); 77sLinux联盟
   host="211.160.92.162"; //服务器地址 77sLinux联盟
   hostinfo=gethostbyname(host); //直接用ip的时候应该不用gethostbayname吧?但我不知道。 77sLinux联盟
/*      因为笔者的socket编程水平实在比较菜,所以必需在/etc/services 中加入一行: 77sLinux联盟
   plc             8090/udp 77sLinux联盟
   才能用下边的程序,那位大侠帮我改改。 77sLinux联盟
   其实就是要向服务器的8090端口发个包而已。 77sLinux联盟
*/ 77sLinux联盟
   servinfo=getservbyname("plc","udp");//老土了。 77sLinux联盟
   sockfd=socket(AF_INET,SOCK_DGRAM,0); 77sLinux联盟
   address.sin_family=AF_INET; 77sLinux联盟
   address.sin_port=servinfo->s_port; 77sLinux联盟
   address.sin_addr=*(struct in_addr *)*hostinfo->h_addr_list; 77sLinux联盟
   len=sizeof(address); 77sLinux联盟
   buffer[0]=0x05;//第一个字段的数据 77sLinux联盟
   int i; 77sLinux联盟
   for (i=2;i<7;i++) 77sLinux联盟
      buffer[i]=0x00; 77sLinux联盟
   buffer[8]=session(sid,FIRST); 77sLinux联盟
   buffer[9]=session(sid,LAST); 77sLinux联盟
   /* 根据sessionid 算出最后两个数据的内容 */ 77sLinux联盟
   printf( "%d \n",session(sid,FIRST));//倒数第二个字段的数据 77sLinux联盟
   printf( "%d \n",session(sid,LAST));//最后一个字段的数据 77sLinux联盟
   while(1){ 77sLinux联盟
      buffer[1]=add(); //每次加一个数。从零开始,没有考虑超过256分钟的情况。 77sLinux联盟
      result=sendto(sockfd,buffer,10,0,(struct sockaddr *)&address,len); 77sLinux联盟
      sleep(60);//等待60秒,应该有更好的方法吧。俺还不会用C的定时器。 77sLinux联盟
   } 77sLinux联盟
   exit(0); 77sLinux联盟
77sLinux联盟
}//end of main 77sLinux联盟
int session(const int sid,const int flag){ 77sLinux联盟
   if(flag==FIRST) 77sLinux联盟
      return (sid&65280)>>8; //倒数第二个字段, 65280 is 1111111100000000 77sLinux联盟
   else 77sLinux联盟
      return (sid&255); //最后一个字段。 77sLinux联盟
} 77sLinux联盟
int add(){ 77sLinux联盟
   static i=-1; 77sLinux联盟
   i++; 77sLinux联盟
   return i; 77sLinux联盟
} 77sLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·qmail中的几个error的产生的原因和解决方法  (2006-07-09 00:33:46)
 ·qmail在Linux,Solaris系统安装详解  (2006-07-09 00:28:09)
 ·Linux操作系统Gaim玩转QQ MSN  (2006-07-08 23:37:01)
 ·成功在uclinux下实现拨号,总结经验  (2006-07-08 23:24:49)
 ·Solaris、Linux和FreeBSD的内核比较  (2006-07-08 23:20:19)
 ·Linux下各类TCP网络服务器的实现源代码  (2006-07-08 23:18:20)
 ·RedHat Linux 9.0安装图解  (2006-07-08 21:09:06)
 ·打造完美Linux操作系统:实用小窍门  (2006-07-08 13:14:06)
 ·Linux环境下Lotus Domino Notes 6.0的安装与配置  (2006-07-07 21:42:06)
 ·在Debian Linux下用MAME模拟器玩街机游戏  (2006-07-07 21:32:44)