0

tclが提供するudpパッケージを使用して、あるPCから別のPCにUDPパケットを送信しています。受信側では、udpポートにデータがあるときはいつでも、ハンドラーを呼び出してデータを読み取るようにファイルベントを作成しました。しかし、レシーバースクリプトを実行すると、スクリプトで永遠に待つことに言及するまで何も起こりません。udpポートにデータが存在するときはいつでもそれを読みたい機能が必要です。どうすればいいのか教えてください。これが私の送信者と受信者のスクリプトです。

「udp_sender_script.tcl」という名前の送信者スクリプト:

namespace eval soc {
variable s
}

set soc::s [udp_open]
udp_conf $soc::s $IP_ADDR_RX  $UDP_PORT
fconfigure $soc::s -buffering none -translation binary

set data 1234
append hex [ format %04X [ expr $i | 0x8000 ] ]
append hex [ format %08X [ expr $data ] ]

while { 1 } {
after 500
puts -nonewline $soc::s [binary format H* $hex]
}

「udp_receiver_script.tcl」という名前のudpスクリプト

proc udp_listen {} {
set pkt [read $soc::s ]
if { $pkt > 0 } {
puts "received string is $pkt"
}
return 0
}

proc every { ms body } {
eval $body; after $ms [info level 0]}

if { $argc < 1 } {
puts "ERROR! Please give udp port number as an argument while running the script"
} else {
set UDP_PORT [lindex $argv 0]
set  soc::s [udp_open $UDP_PORT]
fconfigure $soc::s -buffering none -translation binary
fileevent $soc::s readable [list ::udp_listen $soc::s]
}

レシーバースクリプトのwhileループでudpポートのデータを読み取る場合、fileeventを使用する代わりに、データを取得します。しかし、whileループを不必要に使用することはありません。この問題を解決するのを手伝ってください。

4

1 に答える 1

2

2 番目のスニペットが完全でない限り、1 つの重要なポイントを見逃していfileeventます。Tcl ランタイムが動作するためには、 で設定されたものを含め、どのタイプのイベントでも「イベント ループに入る」必要があります。これにより、Tcl をイベント ループに入らせたスクリプトの実行が中断され、Tcl コードのさらなる処理は、生成されたさまざまなイベントに応答してのみ行われます。ランタイムによってイベント ループが終了すると、通常の処理が再開されます。

Tk を使用しないプログラムでは、通常、vwait(「変数が書き込まれるまで待機」) コマンドを使用してイベント ループに入り、このように実行されます。これも参照して、一般的に「イベント」というキーワードでウィキを検索してください。

また、 「Building High Performance Networking Servers using Tcl」を読むことを強くお勧めします。

于 2013-01-21T07:58:13.893 に答える