- 论坛徽章:
- 0
|
本帖最后由 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- #!/usr/local/env python
- import os, sys, string
- import socket
- import MySQLdb
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- sock.bind(("192.168.1.251",873)) #端口和地址
- sock.listen(5)
- while True:
- connection,address = sock.accept()
- print 'Server connected by', address
- while True:
- buf = connection.recv(1024)
- user = buf.split('/')
- username = user[0]
- if buf:
- conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns') #联接数据库
- cursor = conn.cursor()
- count = cursor.execute('select id,username,passwd from user where username=username')
- result = cursor.fetchone();
- if result[2] != user[1]:
- connection.send('Your password or username is error.')
- break
- else:
- conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns')
- cursor = conn.cursor()
- count = cursor.execute("select * from ip where uid=%s",result[0])
- ip = cursor.fetchone();
- if ip[1] == result[0]:
- new_address = [address[0],ip[2]]
- conn.select_db('ddns');
- cursor.execute("update ip set ip_address=%s where id=%s",new_address)
- cursor.close();
- conn.close();
- else:
- ip_address = [address[0],result[0],int()]
- conn=MySQLdb.connect(host='localhost',user='root',passwd='pass',db='ddns')
- cursor = conn.cursor()
- conn.select_db('ddns');
- cursor.execute("insert into ip values(%s,%s,%s)",ip_address)
- ip_address=[]
- connection.send('Hello ' + user[0] +'! Your doamin is online.')
- cursor.close();
- conn.close();
- else: break
- connection.send('Hello ' + user[0] +'! Your doamin is online.')
- connection.close()
- sock.close()
复制代码 Client.py- import sys, os, string
- import socket
- if len(sys.argv) < 3:
- print 'sage: %s [username] [password]'% sys.argv[0]
- sys.exit(1)
- import time
- while True:
- v_account = sys.argv[1]
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect (('192。168。1。251', 873))
- sock.send(sys.argv[1]+'/'+sys.argv[2])
- # print sock.recv(1024)
- info = sock.recv(1024)
- sock.close()
- time.sleep(5)
复制代码 范例:
# python Client.py [username] [password] &
后记:
听人说socket的效率,还有python的线程问题,现在这两项还没有深入研究,还请有研究的童鞋多多支持我,另外我在考虑一个问题,能不能在client上开一个子程序来监听客户端IP地址的变化,如果有变化就更新到Server,这样比我现在每5秒发送一次客户端IP地址是否来得更有效率?欢迎大家给我思路! |
|