Difference between revisions of "InSim examples"
From LFS Manual
Jump to navigationJump to search (Improved example)  | 
				|||
| Line 5: | Line 5: | ||
How to connect, send a packet and receive the response.  | How to connect, send a packet and receive the response.  | ||
| − | <big><pre>#   | + | <big><pre># Dependencies.  | 
import socket  | import socket  | ||
| + | import struct  | ||
| − | #   | + | # Some constants.  | 
| − | + | INSIM_VERSION = 4  | |
| + | BUFFER_SIZE = 2048  | ||
| + | |||
| + | # Packet types.  | ||
| + | ISP_ISI = 1  | ||
| + | ISP_VER = 2  | ||
| + | ISP_TINY = 3  | ||
| + | TINY_NONE = 0  | ||
| − | #   | + | # Initailise the socket in TCP mode.  | 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  | ||
| Line 17: | Line 25: | ||
sock.connect(('localhost', 29999))  | sock.connect(('localhost', 29999))  | ||
| − | # Pack the   | + | # Pack the ISI packet into a string.  | 
| − | isi = struct.pack('  | + | isi = struct.pack('BBBBHHBBH16s16s',    | 
| − |                    44,   | + |                    44,          # Size  | 
| − | + |                    ISP_ISI,     # Type  | |
| − | + |                    1,           # ReqI - causes LFS to send an IS_VER.   | |
| − |                    0,   | + |                    0,           # Zero  | 
| − |                    0,   | + |                    0,           # UDPPort  | 
| − |                    0,   | + |                    0,           # Flags  | 
| − |                    0,   | + |                    0,           # Sp0  | 
| − | + |                    0,           # Prefix  | |
| − |                    0,   | + |                    0,           # Interval  | 
| − |                    'password',   | + |                    'password',  # Admin    | 
| − |                    '  | + |                    '^3example') # IName  | 
| − | + | ||
| − | # Send the   | + | # Send the ISI packet to InSim.   | 
sock.send(isi)  | sock.send(isi)  | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
buffer = ''  | buffer = ''  | ||
while True:  | while True:  | ||
| − | + |      data = sock.recv(BUFFER_SIZE)  | |
| − |      data = sock.recv(  | ||
| − | |||
| − | |||
     if data:  |      if data:  | ||
| − | |||
         buffer += data  |          buffer += data  | ||
| − | + | ||
| − |          # Loop through   | + |          # Loop through completed packets.  | 
| − | |||
| − | |||
         while len(buffer) > 0 and len(buffer) >= ord(buffer[0]):  |          while len(buffer) > 0 and len(buffer) >= ord(buffer[0]):  | ||
| − |              # Copy the packet from the buffer.  | + | |
| + |              # Copy the packet from the buffer and delete it.  | ||
             packet = buffer[:ord(buffer[0])]  |              packet = buffer[:ord(buffer[0])]  | ||
| − | |||
| − | |||
             buffer = buffer[ord(buffer[0]):]  |              buffer = buffer[ord(buffer[0]):]  | ||
| − | + | ||
| − |              # check keep alive  | + |             # Check packet type.  | 
| − | + |              if ord(buffer[1]) == ISP_TINY:  | |
| − | + |                 # Unpack the TINY packet and check it for keep-alive signal.  | |
| − | + |                 size, type, reqi, subt = struct.unpack('BBBB', packet)  | |
| − |              #   | + |                 if subt == TINY_NONE:  | 
| + |                     sock.send(packet)  | ||
| + |              elif ord(buffer[1]) == ISP_VER:  | ||
| + |                 # Unpack the VER packet and check the InSim version.  | ||
| + |                 size, type, reqi, _, version, product, insimver = struct.unpack('BBBB8s6sH')  | ||
| + |                 if insimver != INSIM_VERSION:  | ||
| + |                     print 'Invalid InSim version'  | ||
| + |                     break  | ||
     else:    |      else:    | ||
| + |         # InSim connection has been lost.  | ||
         break  |          break  | ||
| − | + | ||
# Release the socket.  | # Release the socket.  | ||
sock.close()</pre></big>  | sock.close()</pre></big>  | ||
Revision as of 15:57, 27 June 2009
Python
Example #1
How to connect, send a packet and receive the response.
# Dependencies.
import socket
import struct
# Some constants.
INSIM_VERSION = 4
BUFFER_SIZE = 2048
# Packet types.
ISP_ISI = 1
ISP_VER = 2
ISP_TINY = 3
TINY_NONE = 0
# Initailise the socket in TCP mode.
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to LFS.
sock.connect(('localhost', 29999))
# Pack the ISI packet into a string.
isi = struct.pack('BBBBHHBBH16s16s', 
                  44,          # Size
                  ISP_ISI,     # Type
                  1,           # ReqI - causes LFS to send an IS_VER. 
                  0,           # Zero
                  0,           # UDPPort
                  0,           # Flags
                  0,           # Sp0
                  0,           # Prefix
                  0,           # Interval
                  'password',  # Admin 
                  '^3example') # IName
                 
# Send the ISI packet to InSim. 
sock.send(isi)
buffer = ''
while True:
    data = sock.recv(BUFFER_SIZE)
    if data:
        buffer += data
        
        # Loop through completed packets.
        while len(buffer) > 0 and len(buffer) >= ord(buffer[0]):
            
            # Copy the packet from the buffer and delete it.
            packet = buffer[:ord(buffer[0])]
            buffer = buffer[ord(buffer[0]):]
            
            # Check packet type.
            if ord(buffer[1]) == ISP_TINY:
                # Unpack the TINY packet and check it for keep-alive signal.
                size, type, reqi, subt = struct.unpack('BBBB', packet)
                if subt == TINY_NONE:
                    sock.send(packet)
            elif ord(buffer[1]) == ISP_VER:
                # Unpack the VER packet and check the InSim version.
                size, type, reqi, _, version, product, insimver = struct.unpack('BBBB8s6sH')
                if insimver != INSIM_VERSION:
                    print 'Invalid InSim version'
                    break
    else: 
        # InSim connection has been lost.
        break
        
# Release the socket.
sock.close()