没有明确的设施来控制发送速率;你需要在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