如何在python中解码TCP / IP数据包?

时间:2015-12-01 12:33:37

标签: python sockets networking tcp

我通过TCP / IP数据包格式的指定端口的IP地址中的tick市场数据流连续点击。我想在csv文件中记录它,或者处理数据流以进行交易和数据分析。

服务器以下列格式发送所有数据包

typedef struct
{
CHAR cCompOrNot
SHORT nDataSize;
SHORT iNoOfPackets;
}ST_COMP_BATCH_HEADER
typedef struct
{
SHORT iCode;
SHORT iLen;
LONG lSeqNo;
} ST_INFO_HEADER;
typedef struct
{
.
.
}ST_DATA_INFO;
typedef struct
{
SHORT iCheckSum;
CHAR cEOT;
} ST_INFO_TRAILER;
typedef struct
{
ST_INFO_HEADER stInfoHdr;
ST_DATA_INFO stDataInfo;
ST_INFO_TRAILER stInfoTrailer;
.
}ST_DATA_PACKET

从服务器接收的所有数据包都包含压缩批处理标头。 压缩批处理标题提供有关数据包的信息 是否压缩,以下数据包中的包数和数据包的总大小。客户端需要使用解压缩数据包 LZO减压算法。解压后的每个数据包 由ST_INFO_HEADER组成,它具有用于标识类型的iCode字段 的包。使用iCode字段,数据信息包被映射到相应的 数据包。

那么有什么方法可以使用一些Python库来解码这些数据包中的数据并解决这个问题。

提前致谢!

1 个答案:

答案 0 :(得分:2)

使用套接字库。以下是连接到tcp / ip端口并直接从Python站点解析数据的代码示例(将HOST静态设置为所需的IP):

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while True:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()

对于Python 2.x:

https://docs.python.org/2/library/socket.html

对于Python 3.x:

https://docs.python.org/3/library/socket.html

LZO Library for Python:

https://pypi.python.org/pypi/python-lzo/1.08