送信レートを制御する明示的な機能はありません。あなたは適切な時間の間、あなた自身でそれを行う必要があります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
あなたはおおよその帯域幅のレートを達成するために遅延とエッチチャンクの数を制御することができます。 – zwer