Difference between revisions of "InSim examples"
From LFS Manual
Jump to navigationJump to searchLine 17: | Line 17: | ||
sock.connect(('localhost', 29999)) | sock.connect(('localhost', 29999)) | ||
− | # Pack the IS_ISI | + | # Pack the IS_ISI data into a string. |
isi = struct.pack('BBBBHHBcH16s16s', | isi = struct.pack('BBBBHHBcH16s16s', | ||
44, # Size | 44, # Size | ||
Line 33: | Line 33: | ||
# Send the string to InSim | # Send the string to InSim | ||
sock.send(isi) | sock.send(isi) | ||
+ | |||
+ | |||
+ | # Some constants. | ||
+ | ISP_TINY = 3 | ||
+ | TINY_NONE = 0 | ||
+ | |||
+ | # keep alive the connection (see below) | ||
+ | def keepAlive(packet): | ||
+ | # Check the packet type. | ||
+ | if ord(packet[1]) == ISP_TINY: | ||
+ | # Unpack the packet data. | ||
+ | tiny = struct.unpack('BBBB', packet) | ||
+ | # Check the SubT. | ||
+ | if tiny[3] == TINY_NONE: | ||
+ | # Send the keep alive packet back to LFS. | ||
+ | sock.send(packet) | ||
+ | |||
# We use a string as the buffer. | # We use a string as the buffer. | ||
Line 38: | Line 55: | ||
while True: | while True: | ||
− | # | + | # Receive up to 1024 bytes of data. |
data = sock.recv(1024) | data = sock.recv(1024) | ||
# If no data is received the connection has closed. | # If no data is received the connection has closed. | ||
if data: | if data: | ||
− | # Append received data onto | + | # Append received data onto the buffer. |
buffer += data | buffer += data | ||
# Loop through each completed packet in the buffer. The first byte of | # Loop through each completed packet in the buffer. The first byte of | ||
− | # each packet is the packet size, so | + | # each packet is the packet size, so check that the length of the |
# buffer is at least the size of the first packet. | # buffer is at least the size of the first packet. | ||
while len(buffer) > 0 and len(buffer) >= ord(buffer[0]): | while len(buffer) > 0 and len(buffer) >= ord(buffer[0]): | ||
Line 56: | Line 73: | ||
buffer = buffer[ord(buffer[0]):] | buffer = buffer[ord(buffer[0]):] | ||
− | # | + | # check keep alive! |
+ | keepAlive(packet) | ||
+ | |||
+ | # The packet is now complete! :) | ||
# doSomethingWithPacket(packet) | # doSomethingWithPacket(packet) | ||
else: | else: | ||
break | break | ||
+ | # Release the socket. | ||
sock.close()</pre></big> | sock.close()</pre></big> |
Revision as of 13:52, 22 June 2009
Python
Example #1
How to connect, send a packet and receive the response.
# Import Python's socket module. import socket # Import Python's struct module, which allows us to pack and unpack strings. import struct # Initialise the socket in TCP mode. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connect to LFS. sock.connect(('localhost', 29999)) # Pack the IS_ISI data into a string. isi = struct.pack('BBBBHHBcH16s16s', 44, # Size 1, # Type 0, # ReqI 0, # Zero 0, # UDPPort 0, # Flags 0, # Sp0 ' ', # Prefix 0, # Interval 'password', # Admin 'MyProgram',) # IName # Send the string to InSim sock.send(isi) # Some constants. ISP_TINY = 3 TINY_NONE = 0 # keep alive the connection (see below) def keepAlive(packet): # Check the packet type. if ord(packet[1]) == ISP_TINY: # Unpack the packet data. tiny = struct.unpack('BBBB', packet) # Check the SubT. if tiny[3] == TINY_NONE: # Send the keep alive packet back to LFS. sock.send(packet) # We use a string as the buffer. buffer = '' while True: # Receive up to 1024 bytes of data. data = sock.recv(1024) # If no data is received the connection has closed. if data: # Append received data onto the buffer. buffer += data # Loop through each completed packet in the buffer. The first byte of # each packet is the packet size, so check that the length of the # buffer is at least the size of the first packet. while len(buffer) > 0 and len(buffer) >= ord(buffer[0]): # Copy the packet from the buffer. packet = buffer[:ord(buffer[0])] # Remove the packet from the buffer. buffer = buffer[ord(buffer[0]):] # check keep alive! keepAlive(packet) # The packet is now complete! :) # doSomethingWithPacket(packet) else: break # Release the socket. sock.close()