From 2111f8aaac6351fb303986b39add99a012633ac2 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 25 Aug 2013 20:51:39 +0800 Subject: ptp v3.0a & server timeout support --- server/piztor/prob.py | 5 ++ server/piztor/ptp.rst | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ server/piztor/server.py | 24 ++++++--- 3 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 server/piztor/ptp.rst diff --git a/server/piztor/prob.py b/server/piztor/prob.py index 1f9bdb7..4ccc957 100644 --- a/server/piztor/prob.py +++ b/server/piztor/prob.py @@ -45,6 +45,11 @@ def send(data): sock.close() return received +from sys import argv + +if len(argv) == 2: + host = argv[1] + username = "hello" password = "world" gid = 1 diff --git a/server/piztor/ptp.rst b/server/piztor/ptp.rst new file mode 100644 index 0000000..c12cf65 --- /dev/null +++ b/server/piztor/ptp.rst @@ -0,0 +1,135 @@ +Piztor Transmission Protocol v0.3a +---------------------------------- + +- General + + - Request + + :: + + +---4b---+---1b---+-------?b--------+ + | LENGTH | OPT_ID | SPECIFIC DATA | + +--int---+-uchar--+-----------------+ + + - Response + + :: + + +---4b---+---1b---+------?b---------+ + | LENGTH | OPT_ID | SPECIFIC DATA | + +--int---+-uchar--+-----------------+ + + Notice: + + - In following sections, ``LENGTH`` part is left out for clarity. + - ``PADDING`` has value ``0``. + - ``AUTH_HEAD`` structure: + + :: + + +----32b-----+----?b----+----1b---+ + | USER_TOKEN | USERNAME | PADDING | + +----raw-----+----------+---------+ + +- Authentication + + - Request + + :: + + +--1b---+-----?b------+----1b----+-----?b-----+ + | 0x00 | USERNAME | PADDING | PASSWORD | + +-uchar-+-------------+----------+------------+ + + - Response + + :: + + +--1b---+---1b---+---4b----+----32b-----+ + | 0x00 | STATUS | USER_ID | USER_TOKEN | + +-uchar-+--uchar-+---int---+----raw-----+ + + ``STATUS`` : + + - ``0x00`` for success + - ``0x01`` for failure + +- Location Update + + - Request + + :: + + +--1b---+-----?b------+----8b------+------8b-----+ + | 0x01 | AUTH_HEAD | LATITUDE | LONGITUDE | + +-uchar-+-------------+---double---+---double----+ + + - Response + + :: + + +--1b---+---1b---+ + | 0x01 | STATUS | + +-uchar-+--uchar-+ + + ``STATUS`` : + + - ``0x00`` for success + - ``0x01`` for invalid token + +- Location Information + + - Request + + :: + + +--1b---+------?b------+------4b-----+ + | 0x02 | AUTH_HEAD | GROUP_ID | + +-uchar-+--------------+-----int-----+ + + - Response + + :: + + +--1b---+---1b---+-----4b----+------20b-------+-----+ + | 0x02 | STATUS | ENTRY_CNT | LOCATION_ENTRY | ... | + +-uchar-+-uchar--+----int----+----------------+-----+ + + ``LOCATION_ENTRY`` : + + :: + + +---4b----+----8b----+-----8b----+ + | USER_ID | LATITUDE | LONGITUDE | + +---int---+--double--+--double---+ + +- User Information + + - Request + + :: + + +--1b---+------?b------+------4b-----+ + | 0x02 | AUTH_HEAD | USER_ID | + +-uchar-+--------------+-----int-----+ + + - Response + + :: + + +--1b---+---1b---+------?b-----+-----+ + | 0x03 | STATUS | UINFO_ENTRY | ... | + +-uchar-+-uchar--+-------------+-----+ + + ``UINFO_ENTRY`` : + + :: + + +----1b----+-----?b-----+ + | INFO_KEY | INFO_VALUE | + +--uchar---+------------+ + + ``INFO_KEY`` : + + :``0x00``: gid (value is a 4-byte ``long int``) + :``0x01``: sex (value is a 1-byte ``boolean``: ``True`` for male, ``False`` for female) diff --git a/server/piztor/server.py b/server/piztor/server.py index 5c3160b..2397225 100644 --- a/server/piztor/server.py +++ b/server/piztor/server.py @@ -2,6 +2,7 @@ from twisted.internet.protocol import Protocol from twisted.internet.protocol import Factory from twisted.internet.endpoints import TCP4ServerEndpoint from twisted.internet import reactor +from twisted.protocols.policies import TimeoutMixin from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker @@ -45,8 +46,8 @@ class _SectionSize: class _OptCode: user_auth = 0x00 - location_update = 0x02 - location_request= 0x03 + location_update = 0x01 + location_request= 0x02 class _StatusCode: sucess = 0x00 @@ -265,17 +266,23 @@ handlers = [UserAuthHandler, def check_header(header): return 0 <= header < len(handlers) -class PTP(Protocol): +class PTP(Protocol, TimeoutMixin): - def __init__(self): + def __init__(self, factory): self.buff = bytes() self.length = -1 + self.factory = factory + + def timeoutConnection(self): + logger.info("The connection times out") def connectionMade(self): logger.info("A new connection is made") + self.setTimeout(self.factory.timeout) def dataReceived(self, data): self.buff += data + self.resetTimeout() print len(self.buff) if len(self.buff) > 4: try: @@ -286,6 +293,8 @@ class PTP(Protocol): logger.warning("Invalid request header") raise BadReqError("Malformed request header") print self.length + if self.length == -1: + return if len(self.buff) == self.length: h = handlers[self.optcode]() reply = h.handle(self.buff[5:]) @@ -299,12 +308,13 @@ class PTP(Protocol): def connectionLost(self, reason): logger.info("The connection is lost") + self.setTimeout(None) class PTPFactory(Factory): - def __init__(self): - pass + def __init__(self, timeout = 10): + self.timeout = timeout def buildProtocol(self, addr): - return PTP() + return PTP(self) endpoint = TCP4ServerEndpoint(reactor, 9990) endpoint.listen(PTPFactory()) -- cgit v1.2.3