Difference between revisions of "InSim examples"
From LFS Manual
Jump to navigationJump to search (Improved example) |
m |
||
| Line 52: | Line 52: | ||
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. |
packet = buffer[:ord(buffer[0])] | packet = buffer[:ord(buffer[0])] | ||
buffer = buffer[ord(buffer[0]):] | buffer = buffer[ord(buffer[0]):] | ||
| Line 61: | Line 61: | ||
size, type, reqi, subt = struct.unpack('BBBB', packet) | size, type, reqi, subt = struct.unpack('BBBB', packet) | ||
if subt == TINY_NONE: | if subt == TINY_NONE: | ||
| − | sock.send(packet) | + | sock.send(packet) # Respond to keep-alive. |
elif ord(buffer[1]) == ISP_VER: | elif ord(buffer[1]) == ISP_VER: | ||
# Unpack the VER packet and check the InSim version. | # Unpack the VER packet and check the InSim version. | ||
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.
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) # Respond to keep-alive.
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()