内网的出口ip地址是动态变化的,而且是路由器动态分配的,在家如果想要连上,理论上需要拿到当前路由器的出口ip地址,及局域网内的端口映射即可.
于是我们可以通过一个简单的python小程序,访问远程地址,拿到当前动态分配的ip.
1.0 版本是这样的 有客户端 有服务端
# -*- coding:utf-8 -*- import socket def udpClient(): address=('127.0.0.1',8080) udpClientSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: data=raw_input('>') if not data: break udpClientSocket.sendto(data,address) data,addr=udpClientSocket.recvfrom(2048) print data udpClientSocket.close() udpClient()
server
# -*- coding:utf-8 -*- import socket from time import ctime def udpServer(): buffer=2048 address=('127.0.0.1',8080) udpsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) udpsock.bind(address) while True: print 'wait for message...' data,addr=udpsock.recvfrom(buffer) udpsock.sendto('[%s]%s' %(ctime(),data),addr) print '...received from and retuned to:',addr udpsock.close() udpServer()
2..0版是这样的 有服务端 无客户端
客户端是 一个定时任务 格式为:
echo 想要发送的内容 > /dev/udp/服务端p/服务端port
样例 : echo something what ? > /dev/udp/192.168.0.1/9090
服务端是这样的
root@localhost:/me/udpservices# more server.py # -*- coding:utf-8 -*- import socket from time import * def udpServer(): buffer=2048 address=('0.0.0.0',1990) try: udpsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) udpsock.bind(address) while True: print 'wait for message...' data,addr=udpsock.recvfrom(buffer) timestr=strftime("%Y-%m-%d %H:%M:%S",localtime()) print addr[0] udpsock.sendto('%s' %(addr[0]),addr) file_out=open("./ip.txt",'a') file_out.write('[%s] %s %s\n' %(timestr,data,addr[0])) print '...received from and retuned to:',addr file_out.close(); finally: udpsock.close() udpServer()