2017-07-16 49 views
0

我想通过千兆链接发送以太网帧与python。所以我用这个代码:调整插槽的速度

while (package_count < packets): 
    package_count += 1 
    s.send(eth_header+eth_payload) 
    sleep(delay) 

套接字之前打开。帧的大小(eth_header + eth_payload)为1500字节,要使用全千兆链路,延迟时间将远离几ms的最小延迟时间。任何想法如何控制发送数据的速度使用Python中的全套接口套接字?

+0

你使用的是TCP还是UDP?阻塞套接字还是非阻塞?如果你完全摆脱了sleep()命令会发生什么? –

+0

我使用SOCK_RAW原始以太网帧(使用wireshark进行检查)。当我删除睡眠时,我得到全速 - 但我想控制我发送的速度 – who93

+1

您可以同时控制eth块的延迟和数量以获得大致的带宽速率。 – zwer

回答

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 
+0

谢谢你的回答。我会以简化的形式尝试,但睡眠命令只能工作10ms左右,对于千兆速度,我需要小于1ms。我现在用C语言实现它,完美运行! – who93