2018年7月3日 星期二

用python接收udp資訊

為了檢查是否有漏封包,寫了一支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



ubuntu 安裝完kubernetes後做apt-get update會出現錯誤

root@k8s02:~# sudo apt-get update 已有:1 http://tw.archive.ubuntu.com/ubuntu xenial InRelease 已有:2 http://tw.archive.ubuntu.com/ubuntu xenia...