為了檢查是否有漏封包,寫了一支python程式接收UDP證券行情資訊,並拆解行情封包,監控並記錄接收到的資料
# -*- coding: utf-8 -*-
# 若要在程式中加入中文,需要加入上行
import sys
from socket import *
from datetime import *
multicast_group = sys.argv[1]
multicast_port = int(sys.argv[2])
interface_ip = '10.168.100.233'
f = open('tse001.txt', 'a')
s = socket(AF_INET, SOCK_DGRAM )
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #要讓程式可以重複使用位址及port,必須設定此行`
s.bind((multicast_group, multicast_port ))
mreq = inet_aton(multicast_group) + inet_aton(interface_ip)
s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mreq))
while 1:
now = datetime.today()
str1 = s.recv(1500)
msg = now.strftime('%Y%m%d%H%M%S')
m_2_1_1 = bin(ord(str1[1]))[2:].zfill(8)
m_2_1_1a = chr(int("0b0011" + m_2_1_1[1:4].zfill(4),2))
m_2_1_1b = chr(int("0b0011" + m_2_1_1[5:8].zfill(4),2))
m_2_1_2 = bin(ord(str1[2]))[2:].zfill(8)
m_2_1_2a = chr(int("0b0011" + m_2_1_2[1:4].zfill(4),2))
m_2_1_2b = chr(int("0b0011" + m_2_1_2[5:8].zfill(4),2))
m_2_2_1 = bin(ord(str1[3]))[2:].zfill(8)
m_2_2_1a = chr(int("0b0011" + m_2_2_1[1:4].zfill(4),2))
m_2_2_1b = chr(int("0b0011" + m_2_2_1[5:8].zfill(4),2))
m_2_3_1 = bin(ord(str1[4]))[2:].zfill(8)
m_2_3_1a = chr(int("0b0011" + m_2_3_1[1:4].zfill(4),2))
m_2_3_1b = chr(int("0b0011" + m_2_3_1[5:8].zfill(4),2))
m_2_4_1 = bin(ord(str1[5]))[2:].zfill(8)
m_2_4_1a = chr(int("0b0011" + m_2_4_1[1:4].zfill(4),2))
m_2_4_1b = chr(int("0b0011" + m_2_4_1[5:8].zfill(4),2))
m_2_5_1 = bin(ord(str1[6]))[2:].zfill(8)
m_2_5_1a = chr(int("0b0011" + m_2_5_1[1:4].zfill(4),2))
m_2_5_1b = chr(int("0b0011" + m_2_5_1[5:8].zfill(4),2))
m_2_5_2 = bin(ord(str1[7]))[2:].zfill(8)
m_2_5_2a = chr(int("0b0011" + m_2_5_2[1:4].zfill(4),2))
m_2_5_2b = chr(int("0b0011" + m_2_5_2[5:8].zfill(4),2))
m_2_5_3 = bin(ord(str1[8]))[2:].zfill(8)
m_2_5_3a = chr(int("0b0011" + m_2_5_3[1:4].zfill(4),2))
m_2_5_3b = chr(int("0b0011" + m_2_5_3[5:8].zfill(4),2))
m_2_5_4 = bin(ord(str1[9]))[2:].zfill(8)
m_2_5_4a = chr(int("0b0011" + m_2_5_4[1:4].zfill(4),2))
m_2_5_4b = chr(int("0b0011" + m_2_5_4[5:8].zfill(4),2))
m_2_5 = m_2_5_1a + m_2_5_1b + m_2_5_2a + m_2_5_2b + m_2_5_3a + m_2_5_3b + m_2_5_4a + m_2_5_4b
msg = msg + m_2_1_1a + m_2_1_1b + m_2_1_2a + m_2_1_2b + m_2_2_1a + m_2_2_1b + m_2_3_1a + m_2_3_1b + m_2_4_1a + m_2_4_1b + m_2_5
print "msg =", msg
f.write(msg)
f.write('\n')
其中加了一行
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
這是因為socket 預設不得重複占用位址,若要重複使用需調整程式中增加socket參數設定
socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
若有大量重複使用位址的需求,須直接調整系統網路參數設定,否則會有大量timeout或waitting狀況
系統網路參數調整方式:
vi /etc/sysctl.conf
加入
net.ipv4.tcp_syncookies = 1 #這一行配置文件里如果有就不用添加了
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5
然後執行以下命令,讓設定生效
/sbin/sysctl -p