Rawsocketpy Documentation: Release 1.2.1
Rawsocketpy Documentation: Release 1.2.1
Release 1.2.1
Alexis Paques
1 Installation 1
2 Quicktest 3
3 API 5
5 Make it a server 13
6 Go asynchronous 15
i
ii
CHAPTER 1
Installation
Listing 1: installation
# for development
git clone https://github.com/AlexisTM/rawsocket_python
cd rawsocket_python
sudo python pip . -e
# manually
git clone https://github.com/AlexisTM/rawsocket_python
sudo python setup.py install
Listing 2: installation
sudo -H python -m pip install gevent
1
RawSocketPy Documentation, Release 1.2.1
2 Chapter 1. Installation
CHAPTER 2
Quicktest
The simplest example to ensure the library is working for you is to take two machines (or one with two network cards)
and run the following.
> Ensure to set your interface name instead of wlp2s0.
On the first machine:
3
RawSocketPy Documentation, Release 1.2.1
4 Chapter 2. Quicktest
CHAPTER 3
API
5
RawSocketPy Documentation, Release 1.2.1
Type bool
type = None
Description Ethertype
Type str or bytes or bytearray
class rawsocketpy.socket.RawSocket(interface, protocol, sock=None, no_recv_protocol=False)
Bases: object
RawSocket is using the socket library to send raw ethernet frames, using socket.RAW_SOCK
It has a similar API to the socket library: send/recv/close/dup.
BROADCAST = 'ÿÿÿÿÿÿ'
Description Default MAC address: "\xff\xff\xff\xff\xff\xff"
__init__(interface, protocol, sock=None, no_recv_protocol=False)
Parameters
• interface (str) – interface to be used.
• protocol (int) – Ethernet II protocol, RawSocket [1536-65535]
• socket (socket.socket) – Socket to be used (default None), if not given, a new one
will be created.
• no_recv_protocol (bool) – If true (default False), the socket will not subscribe to
anything, recv will just block.
dup()
Duplicates the RawSocket
mac = None
Description Source MAC address used for communications - could be modified after initializa-
tion
Type str/bytes/bytearray
recv()
Receive data from the socket on the protocol provided in the constructor
Blocks until data arrives. A timeout can be implemented using the socket timeout.
Return type RawPacket
send(msg, dest=None, ethertype=None)
Sends data through the socket.
Parameters
• msg (str/bytes/bytearray) – Payload to be sent
• dest (str/bytes/bytearray) – recipient such as "\xff\x12\x32\x34\x41"
or bytes([1,2,3,4,5,6]). It will broadcast if no given default(None)
• ethertype (str/bytes/bytearray) – Allow to send data using a different ether-
type using the same socket. Default is the protocol given in the constructor.
static sock_create(interface, protocol, sock=None)
class rawsocketpy.server.RawRequestHandler(packet, server)
Bases: object
6 Chapter 3. API
RawSocketPy Documentation, Release 1.2.1
The class that handles the request. It has access to the packet and the server data.
__init__(packet, server)
Initialize self. See help(type(self)) for accurate signature.
finish()
empty: To be overwritten
handle()
empty: To be overwritten
packet = None
Description Packet received
Type RawPacket
run()
Run the request handling process:
try:
• self.setup()
• self.handle()
finally:
• self.finish()
server = None
Description Server from which the packet comes
Type RawServer
setup()
empty: To be overwritten
class rawsocketpy.server.RawServer(interface, protocol, RequestHandlerClass)
Bases: object
A Blocking base server implementation of a server on top of the RawSocket. It waits for data, encapsulate the
data in the RequestHandlerClass provided and blocks until the RequestHandlerClass run() function finishes.
Note packet = recv() -> RequestHandlerClass(packet) -> RequestHandlerClass.run() -> loop
__init__(interface, protocol, RequestHandlerClass)
Parameters
• interface (str) – interface to be used.
• protocol (int) – Ethernet II protocol, RawSocket [1536-65535]
• RequestHandlerClass (RawServerCallback) – The class that will handle the
requests
handle_handler(handler)
Manage the handler, can be overwritten
spin()
Loops until self.running becomes False (from a Request Handler or another thread/coroutine)
spin_once()
Handles the next message
7
RawSocketPy Documentation, Release 1.2.1
>>> to_bytes("123")
bytearray(b'123')
>>> to_bytes(1, 2, 3)
bytearray(b'\x01\x02\x03')
>>> to_bytes("\xff", "\x01\x02")
bytearray(b'\xff\x01\x02')
>>> to_bytes(1, 2, 3, [4,5,6])
bytearray(b'\x01\x02\x03\x04\x05\x06')
>>> to_bytes(bytes([1,3,4]), bytearray([6,7,8]), "\xff")
bytearray(b'\x01\x03\x04\x06\x07\x08\xff')
8 Chapter 3. API
RawSocketPy Documentation, Release 1.2.1
rawsocketpy.util.to_str(data, separator=’:’)
Stringify hexadecimal input;
Parameters
• data (str or bytes or bytearray) – Raw data to print
• separator (str) – The separator to be used between the two digits hexadecimal data.
>>> to_str(bytes([1,16,5]))
"01:0F:05"
>>> to_str(bytes([1,16,5]), separator="")
"010F05"
9
RawSocketPy Documentation, Release 1.2.1
10 Chapter 3. API
CHAPTER 4
You can use the library with a low level socket, where you handle to send and receive.
# If you are using Python2, all data is encoded as unicode strings "\x01.." while
˓→Python3 uses bytearray.
11
RawSocketPy Documentation, Release 1.2.1
Make it a server
Stateless blocking server example: Each time you receive a packet, it will be of type LongTaskTest and run
setup(), handle() and finally finish. If the handle/setup fails, the finish function will be executed.
class LongTaskTest(RawRequestHandler):
def setup(self):
print("Begin")
def handle(self):
time.sleep(1)
print(self.packet)
def finish(self):
print("End")
def main():
rs = RawServer("wlp2s0", 0xEEFA, LongTaskTest)
rs.spin()
if __name__ == '__main__':
main()
Statefull and blocking server using a centralised callback. It does guarantee that the callback is called in ethernet
packet order, but if the execution is long, you will loose packets.
13
RawSocketPy Documentation, Release 1.2.1
class LongTaskTest(RawRequestHandler):
def handle(self):
time.sleep(1)
print(self.packet)
def finish(self):
print("End")
def setup(self):
print("Begin")
def main():
rs = RawServerCallback("wlp2s0", 0xEEFA, LongTaskTest, callback)
rs.spin()
if __name__ == '__main__':
main()
Go asynchronous
Install gevent and you are ready to use asynchronous servers. The asynchronous server is a very small modification
from the base RawServer.
class LongTaskTest(RawRequestHandler):
def handle(self):
time.sleep(1)
print(self.packet)
def finish(self):
print("End")
def setup(self):
print("Begin")
def main():
rs = RawAsyncServer("wlp2s0", 0xEEFA, LongTaskTest)
rs.spin()
if __name__ == '__main__':
main()
15
RawSocketPy Documentation, Release 1.2.1
class LongTaskTest(RawRequestHandler):
def handle(self):
time.sleep(1)
print(self.packet)
def finish(self):
print("End")
def setup(self):
print("Begin")
def main():
rs = RawAsyncServerCallback("wlp2s0", 0xEEFA, LongTaskTest, callback)
rs.spin()
if __name__ == '__main__':
main()
16 Chapter 6. Go asynchronous
CHAPTER 7
• genindex
• modindex
• search
17
RawSocketPy Documentation, Release 1.2.1
r
rawsocketpy, 5
rawsocketpy.packet, 5
rawsocketpy.server, 6
rawsocketpy.socket, 6
rawsocketpy.util, 8
19
RawSocketPy Documentation, Release 1.2.1
21