沒有明確的設施來控制發送速率;你需要在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
你使用的是TCP還是UDP?阻塞套接字還是非阻塞?如果你完全擺脫了sleep()命令會發生什麼? –
我使用SOCK_RAW原始以太網幀(使用wireshark進行檢查)。當我刪除睡眠時,我得到全速 - 但我想控制我發送的速度 – who93
您可以同時控制eth塊的延遲和數量以獲得大致的帶寬速率。 – zwer