免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3196 | 回复: 0
打印 上一主题 下一主题

写一个动态DNS的小程序! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-30 09:24 |只看该作者 |倒序浏览
本帖最后由 wan8832 于 2011-09-30 09:39 编辑

新手初学python,基本上是一边看手册,一边摸索着做的!

先说一下环境:

         python2.7+MySQLdb+bind9  (FreeBSD 7.3,只会用这个系统,之前在写这个东东之前曾经在VMware和真实环境下安装了Gentoo,不太熟练,所以放弃)
原理:
         客户端登陆进守护进程,每5秒,SOCKET把IP地址==>服务端, 服务端接收IP地址后,根据用户的ID查询ip表中是否有此用户,没有则插入新IP地址,有则更新最新的IP地址,最后bind reload(我用的是bind-mysqldb,所以不用reload)

      目前只实现了linux下的client,win下的有空再搞(只会VB{:2_169:} 不知道能不能实现),server端还待完善的地方有,daemon,demo.conf,thread,log还有多记录(A,MX,TXT,CNAME,NS)

以下是Server.py
  1. #!/usr/local/env python
  2. import os, sys, string
  3. import socket
  4. import MySQLdb

  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  7. sock.bind(("192.168.1.251",873))    #端口和地址
  8. sock.listen(5)
  9. while True:
  10.         connection,address = sock.accept()
  11.         print 'Server connected by', address
  12.         while True:
  13.             buf = connection.recv(1024)
  14.             user = buf.split('/')
  15.             username = user[0]
  16.             if buf:
  17.                 conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns')     #联接数据库
  18.                 cursor = conn.cursor()
  19.                 count = cursor.execute('select id,username,passwd from user where username=username')
  20.                 result = cursor.fetchone();
  21.                 if result[2] != user[1]:
  22.                         connection.send('Your password or username is error.')
  23.                         break
  24.                 else:
  25.                         conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns')
  26.                         cursor = conn.cursor()
  27.                         count = cursor.execute("select * from ip where uid=%s",result[0])
  28.                         ip = cursor.fetchone();
  29.                         if ip[1] == result[0]:
  30.                                 new_address = [address[0],ip[2]]
  31.                                 conn.select_db('ddns');
  32.                                 cursor.execute("update ip set ip_address=%s where id=%s",new_address)
  33.                                 cursor.close();
  34.                                 conn.close();
  35.                         else:
  36.                                 ip_address = [address[0],result[0],int()]
  37.                                 conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns')
  38.                                 cursor = conn.cursor()
  39.                                 conn.select_db('ddns');
  40.                                 cursor.execute("insert into ip values(%s,%s,%s)",ip_address)
  41.                                 ip_address=[]
  42.                                 connection.send('Hello ' + user[0] +'! Your doamin is online.')
  43.                                 cursor.close();
  44.                                 conn.close();
  45.             else: break
  46.             connection.send('Hello ' + user[0] +'! Your doamin is online.')
  47.         connection.close()
  48. sock.close()
复制代码
Client.py
  1. import sys, os, string
  2. import socket

  3. if len(sys.argv) < 3:
  4.     print 'sage: %s [username] [password]'% sys.argv[0]
  5.     sys.exit(1)
  6. import time
  7. while True:
  8.         v_account = sys.argv[1]
  9.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10.         sock.connect (('192。168。1。251', 873))
  11.         sock.send(sys.argv[1]+'/'+sys.argv[2])
  12. #      print sock.recv(1024)
  13.         info = sock.recv(1024)
  14.         sock.close()
  15.         time.sleep(5)
复制代码
范例:
# python Client.py [username] [password] &


后记:
    听人说socket的效率,还有python的线程问题,现在这两项还没有深入研究,还请有研究的童鞋多多支持我,另外我在考虑一个问题,能不能在client上开一个子程序来监听客户端IP地址的变化,如果有变化就更新到Server,这样比我现在每5秒发送一次客户端IP地址是否来得更有效率?欢迎大家给我思路!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP