调整插座速度

时间:2017-07-16 19:49:41

标签: python sockets

我正在尝试使用python通过千兆链路发送以太网帧。因此我使用了这段代码:

<br>

之前打开套接字。帧的大小(eth_header + eth_payload)是1500字节,要使用全千兆链路,延迟时间将远离几毫秒的最小延迟时间。知道如何使用python中的完整千兆位套接字来控制发送数据的速度吗?

1 个答案:

答案 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