2017-07-16 8 views
0

私は、pythonでギガビットリンク経由でイーサネットフレームを送信しようとしています。したがって、私はこのコードを使用しました:ソケットの速度を調整する

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

ソケットが開く前に。フレーム(eth_header + eth_payload)のサイズは1500バイトで、ギガビットリンク全体を使用する場合、遅延時間は数ミリ秒の最小遅延時間からはるかに離れています。任意のアイデアどのようにpythonでソケット上の完全なギガビットを使用してデータを送信する速度を制御するには?

+0

TCPまたはUDPを使用していますか?ブロッキングソケットまたは非ブロッキング? sleep()コマンドを完全に取り除くとどうなりますか? –

+0

私はSOCK_RAW(wiresharkでチェックされています)で生のイーサネットフレームを使用しています。私は睡眠を削除するとき、私は完全な速度を得る - しかし、私は送信している速度を制御したい – who93

+1

あなたはおおよその帯域幅のレートを達成するために遅延とエッチチャンクの数を制御することができます。 – 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

あなたの答えに感謝します。私はこれを簡単な形式で試してみますが、sleepコマンドは約10msの間だけ信頼性があります。ギガビットの速度では1ms以下が必要です。私はこれをC言語で実装し、完璧に動作しました! – who93

関連する問題