2017-07-16 78 views
0

我想通過千兆鏈接發送以太網幀與python。所以我用這個代碼:調整插槽的速度

while (package_count < packets): 
    package_count += 1 
    s.send(eth_header+eth_payload) 
    sleep(delay) 

套接字之前打開。幀的大小(eth_header + eth_payload)爲1500字節,要使用全千兆鏈路,延遲時間將遠離幾ms的最小延遲時間。任何想法如何控制發送數據的速度使用Python中的全套接口套接字?

+0

你使用的是TCP還是UDP?阻塞套接字還是非阻塞?如果你完全擺脫了sleep()命令會發生什麼? –

+0

我使用SOCK_RAW原始以太網幀(使用wireshark進行檢查)。當我刪除睡眠時,我得到全速 - 但我想控制我發送的速度 – who93

+1

您可以同時控制eth塊的延遲和數量以獲得大致的帶寬速率。 – zwer

回答

0

沒有明確的設施來控制發送速率;你需要在sleep()的時間內自己完成適當的時間。計算傳入sleep()的適當值是唯一棘手的部分;我通過保持迄今爲止已發送的字節數的計數器並從該計數器中減去已經過去的時間量中「應該發送」的字節數來完成。這樣我就可以在任何時候知道我有多少字節 - 我可以提前多少個字節,這可以直接轉化爲我提前多少秒鐘,這是我應該睡多久以便回來「按照時間表」。

示例代碼如下;它發送UDP數據包而不是原始數據,但邏輯相同。

import socket 
import time 

# We'll limit ourself to a 40KB/sec maximum send rate 
maxSendRateBytesPerSecond = (40*1024) 

def ConvertSecondsToBytes(numSeconds): 
    return numSeconds*maxSendRateBytesPerSecond 

def ConvertBytesToSeconds(numBytes): 
    return float(numBytes)/maxSendRateBytesPerSecond 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.connect(('127.0.0.1', 8888)) 

# We'll add to this tally as we send() bytes, and subtract from 
# at the schedule specified by (maxSendRateBytesPerSecond) 
bytesAheadOfSchedule = 0 

# Dummy data buffer, just for testing 
dataBuf = bytearray(1024) 

prevTime = None 

while True: 
    now = time.time() 
    if (prevTime != None): 
     bytesAheadOfSchedule -= ConvertSecondsToBytes(now-prevTime) 
    prevTime = now 

    numBytesSent = sock.send(dataBuf) 
    if (numBytesSent > 0): 
     bytesAheadOfSchedule += numBytesSent 
     if (bytesAheadOfSchedule > 0): 
     time.sleep(ConvertBytesToSeconds(bytesAheadOfSchedule)) 
    else: 
     print "Error sending data, exiting!" 
     break 
+0

謝謝你的回答。我會以簡化的形式嘗試,但睡眠命令只能工作10ms左右,對於千兆速度,我需要小於1ms。我現在用C語言實現它,完美運行! – who93