内网的出口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()