# -*- 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]))