我正在尝试使用python通过千兆链路发送以太网帧。因此我使用了这段代码:
<br>
之前打开套接字。帧的大小(eth_header + eth_payload)是1500字节,要使用全千兆链路,延迟时间将远离几毫秒的最小延迟时间。知道如何使用python中的完整千兆位套接字来控制发送数据的速度吗?
答案 0 :(得分: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