# -*- coding: GBK -*-
|
|
import os
|
from socket import *
|
import struct
|
import binascii
|
import traceback
|
|
#----------------------дÈë
|
def WriteBYTE(buf, value):
|
buf += struct.pack('B', value)
|
return buf
|
|
def WriteWORD(buf, value):
|
buf += struct.pack('H', value)
|
return buf
|
|
def WriteDWORD(buf, value):
|
buf += struct.pack('I', value)
|
return buf
|
|
def WriteFloat(buf, value):
|
buf += struct.pack('f', value)
|
return buf
|
|
def WriteDouble(buf, value):
|
buf += struct.pack('d', value)
|
return buf
|
|
def WriteString(buf, len, value):
|
buf += struct.pack('%ds'%len, value)
|
return buf
|
|
|
#------------------------¶ÁÈ¡
|
def ReadBYTE(buf, pos):
|
curValue = struct.unpack_from('B', buf, pos)
|
pos += 1
|
return curValue[0], pos
|
|
def ReadWORD(buf, pos):
|
curValue = struct.unpack_from('H', buf, pos)
|
pos += 2
|
return curValue[0], pos
|
|
def ReadDWORD(buf, pos):
|
curValue = struct.unpack_from('I', buf, pos)
|
pos += 4
|
return curValue[0], pos
|
|
def ReadFloat(buf, pos):
|
curValue = struct.unpack_from('f', buf, pos)
|
pos += 4
|
return curValue[0], pos
|
|
def ReadDouble(buf, pos):
|
curValue = struct.unpack_from('d', buf, pos)
|
pos += 8
|
return curValue[0], pos
|
|
def ReadString(buf, pos, _len):
|
curValue = struct.unpack_from('%ds'%_len, buf, pos)
|
pos += _len
|
return curValue[0], pos
|
|
def PackParse(data):
|
buf = data
|
recvdata = ''
|
pos = 0
|
try:
|
PackHead, pos = ReadWORD(buf, pos)
|
|
if PackHead != 0xCCFF:
|
print 'PackHead not the 0xCCFF'
|
return data
|
|
packlen, pos = ReadDWORD(buf, pos)
|
if packlen + pos != len(data):
|
print 'PackLen Wrong!'
|
return data
|
|
curPack , pos = ReadDWORD(buf, pos) #SessionID
|
curPack , pos = ReadWORD(buf, pos) #PoolIndex
|
curPack , pos = ReadBYTE(buf, pos) #Type
|
curPack, pos = ReadBYTE(buf, pos) #DestServerType
|
curPack, pos = ReadBYTE(buf, pos) #SrcServerType
|
curPack , pos = ReadString(buf, pos, len(data)-pos)
|
recvdata = str(curPack)
|
|
except:
|
print traceback.format_exc()
|
return data
|
|
return recvdata
|
|
fullfilename = '' #±£´æRoute·µ»ØµÄÏà¹ØÐÅÏ¢µÄÎļþ
|
BUFSIZ = 1024
|
|
def GetServerVersion(sClient, fResult):
|
global fullfilename
|
global BUFSIZ
|
|
data = ''
|
data = WriteDWORD(data,0) #SessionID = 0
|
data = WriteWORD(data,0) #PoolIndex = 0
|
data = WriteBYTE(data,2) #Type = atInner
|
data = WriteBYTE(data,5) #DestServerType = stRoute
|
data = WriteBYTE(data,6) #SrcServerType = stMap
|
data = WriteBYTE(data,37) #TMapServerToBalanceServer = mgServerVersion
|
data = WriteDWORD(data,0)
|
datalen = len(data)
|
head = ''
|
head = WriteDWORD(head,datalen)
|
data = head + data
|
__PackHead = 0xCCFF
|
PackHead = ''
|
PackHead = WriteWORD(PackHead, __PackHead)
|
data = PackHead + data
|
|
recvdata = ''
|
while True:
|
print 'ÇëÇó°æ±¾ÖС£¡£¡£¡£'
|
sClient.send(data)
|
print '½ÓÊܰ汾ÖС£¡£¡£¡£'
|
dataRecv = sClient.recv(BUFSIZ)
|
if not dataRecv :
|
continue
|
|
resultData = PackParse(dataRecv)
|
#Èç¹ûÊý¾Ý²»ÍêÕû£¬ÔòÖØ·¢ÔÙ½ÓÊÕ¡£
|
if resultData == dataRecv:
|
print 'Êý¾Ý²»ÍêÕû,ÖØ½Ó¡£¡£¡£¡£'
|
continue
|
try:
|
#print str(resultData)
|
#print fResult
|
if str(resultData)=="":
|
continue
|
fResult.write(str(resultData))
|
print "ÇëÇó°æ±¾½á¹û[%s]"%str(resultData)
|
except:
|
print "Write %s failed"%fullfilename
|
os.system("pause")
|
return
|
print "Write SoftVersion OK"
|
break
|
|
def GetLineID(sClient, fResult):
|
global fullfilename
|
global BUFSIZ
|
|
data = ''
|
data = WriteDWORD(data,0) #SessionID = 0
|
data = WriteWORD(data,0) #PoolIndex = 0
|
data = WriteBYTE(data,2) #Type = atInner
|
data = WriteBYTE(data,5) #DestServerType = stRoute
|
data = WriteBYTE(data,6) #SrcServerType = stMap
|
data = WriteBYTE(data,41) #TMapServerToBalanceServer = mgLineID
|
data = WriteDWORD(data,0)
|
datalen = len(data)
|
head = ''
|
head = WriteDWORD(head,datalen)
|
data = head + data
|
__PackHead = 0xCCFF
|
PackHead = ''
|
PackHead = WriteWORD(PackHead, __PackHead)
|
data = PackHead + data
|
|
recvdata = ''
|
while True:
|
print 'ÇëÇó·ÖÏßIDÖС£¡£¡£¡£'
|
sClient.send(data)
|
print '½ÓÊÜ·ÖÏßIDÖС£¡£¡£¡£'
|
dataRecv = sClient.recv(BUFSIZ)
|
if not dataRecv :
|
continue
|
|
resultData = PackParse(dataRecv)
|
#Èç¹ûÊý¾Ý²»ÍêÕû£¬ÔòÖØ·¢ÔÙ½ÓÊÕ¡£
|
if resultData == dataRecv:
|
print 'Êý¾Ý²»ÍêÕû,ÖØ½Ó¡£¡£¡£¡£'
|
continue
|
try:
|
#print str(resultData)
|
fResult.write(str(resultData))
|
print "ÇëÇó·ÖÏßID½á¹û[%s]"%str(resultData)
|
except:
|
print "Write %s failed"%fullfilename
|
os.system("pause")
|
return
|
print "Write LineID OK"
|
break
|
|
|
|
|
def process(IP,Port):
|
global fullfilename
|
|
print IP,Port
|
|
if not os.path.isdir(os.getcwd()+'//RouterInfoResult'):
|
os.makedirs('RouterInfoResult')
|
|
try:
|
fullfilename = os.getcwd()+'\\RouterInfoResult\\Result.txt'
|
fileSave = open(fullfilename,'w')
|
except:
|
print "Can not open %s in w mode"%fullfilename
|
os.system("pause")
|
return
|
HOST = IP
|
PORT = Port
|
ADDR = (HOST, PORT)
|
|
try:
|
tcpCliSock = socket(AF_INET, SOCK_STREAM)
|
tcpCliSock.connect(ADDR)
|
except:
|
print "Can't Connect To Route Server. IP = %s, Port = %s"%(IP,Port)
|
os.system("pause")
|
return
|
|
GetServerVersion(tcpCliSock, fileSave) #ÇëÇó·þÎñÆ÷°æ±¾ÐÅÏ¢
|
GetLineID(tcpCliSock, fileSave) #ÇëÇó·þÎñÆ÷·ÖÏßID
|
|
fileSave.close()
|
tcpCliSock.close()
|
return
|
|
|
process(os.sys.argv[1], int(os.sys.argv[2]))
|