python检测远程udp端口是否打开的方法
本文实例讲述了python检测远程udp端口是否打开的方法。分享给大家供大家参考。具体实现方法如下:
importsocket
importthreading
importtime
importstruct
importQueue
queue=Queue.Queue()
defudp_sender(ip,port):
try:
ADDR=(ip,port)
sock_udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock_udp.sendto("abcd...",ADDR)
sock_udp.close()
except:
pass
deficmp_receiver(ip,port):
icmp=socket.getprotobyname("icmp")
try:
sock_icmp=socket.socket(socket.AF_INET,socket.SOCK_RAW,icmp)
exceptsocket.error,(errno,msg):
iferrno==1:
#Operationnotpermitted
msg=msg+(
"-NotethatICMPmessagescanonlybesentfromprocesses"
"runningasroot."
)
raisesocket.error(msg)
raise#raisetheoriginalerror
sock_icmp.settimeout(3)
try:
recPacket,addr=sock_icmp.recvfrom(64)
except:
queue.put(True)
return
icmpHeader=recPacket[20:28]
icmpPort=int(recPacket.encode('hex')[100:104],16)
head_type,code,checksum,packetID,sequence=struct.unpack(
"bbHHh",icmpHeader
)
sock_icmp.close()
ifcode==3andicmpPort==portandaddr[0]==ip:
queue.put(False)
return
defchecker_udp(ip,port):
thread_udp=threading.Thread(target=udp_sender,args=(ip,port))
thread_icmp=threading.Thread(target=icmp_receiver,args=(ip,port))
thread_udp.daemon=True
thread_icmp.daemon=True
thread_icmp.start()
time.sleep(0.1)
thread_udp.start()
thread_icmp.join() thread_udp.join() returnqueue.get(False) if__name__=='__main__': importsys printchecker_udp(sys.argv[1],int(sys.argv[2]))