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