Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tcl中的fileevent在接收udp数据时不工作。怎么做?_Tcl - Fatal编程技术网

tcl中的fileevent在接收udp数据时不工作。怎么做?

tcl中的fileevent在接收udp数据时不工作。怎么做?,tcl,Tcl,我使用tcl提供的udp包从一台电脑向另一台电脑发送udp数据包。在接收方,我创建了一个filevent,这样每当udp端口上有数据时,它就应该调用处理程序来读取数据。但是当我运行我的接收器脚本时,在脚本中提到“永远等待”之前,什么都不会发生。我想要一个功能,每当udp端口上存在数据时,我都想读取它。请告诉我怎么做。这是我的发送者和接收者脚本 名为“udp_sender_script.tcl”的发送方脚本: 名为“udp_receiver_script.tcl”的udp脚本 proc udp_l

我使用tcl提供的udp包从一台电脑向另一台电脑发送udp数据包。在接收方,我创建了一个filevent,这样每当udp端口上有数据时,它就应该调用处理程序来读取数据。但是当我运行我的接收器脚本时,在脚本中提到“永远等待”之前,什么都不会发生。我想要一个功能,每当udp端口上存在数据时,我都想读取它。请告诉我怎么做。这是我的发送者和接收者脚本

名为“udp_sender_script.tcl”的发送方脚本:

名为“udp_receiver_script.tcl”的udp脚本

proc udp_listen{}{
设置pkt[读取$soc::s]
如果{$pkt>0}{
放置“收到的字符串为$pkt”
}
返回0
}
proc every{ms body}{
eval$body;在$ms之后[信息级别0]}
如果{$argc<1}{
放置“错误!请在运行脚本时提供udp端口号作为参数”
}否则{
设置UDP_端口[lindex$argv 0]
设置soc::s[udp\U打开$udp\U端口]
fconfigure$soc::s-缓冲无-转换二进制文件
fileevent$soc::s可读[列表::udp_侦听$soc::s]
}

如果我在接收器脚本中的while循环中读取udp端口上的数据,而不是使用fileevent,那么我将获得数据。但我不想不必要地使用while循环。请帮我解决这个问题。

除非您的第二个代码片段没有真正完成,否则您会错过一个关键点:对于任何类型的事件,包括使用
fileevent
设置的事件,Tcl运行时必须“进入事件循环”。这将暂停使Tcl进入事件循环的脚本的执行,并且Tcl代码的进一步处理仅在响应生成的各种事件时进行。当运行时留下事件循环时,正常处理将恢复

在不使用Tk的程序中,事件循环通常使用(“等待变量写入”)命令输入,然后完成。另请参阅,通常搜索“事件”关键字


我也强烈推荐阅读。

谢谢您的回复kostix。但我也在使用Tk。因此,如果我进入任何事件循环,它将停止GUI的正常处理,除非在运行时留下事件循环。这是我真正不想要的。我是对的???@user1497818,不,Tk的事件循环已经启动并进入。您可以想象当
wish
执行从该事件循环调用的脚本时运行的“顶级”代码。这也意味着你的问题可能在其他地方。。。您确定在设置文件事件处理程序后不会阻塞其他(Tk?)回调代码吗?如果是这样,有什么方法可以做到这一点吗??我曾尝试为此创建一个tcl线程,但这对我不起作用。请告诉我您是否有正确的方法读取udp端口上随机出现的数据。@user1497818,no thead不适合这种情况。文件事件可以和UDP包一起工作(我在生产代码中使用它)。再说一次,您能保证您不会在其他回调代码中忙着等待吗?不要再问“正确的方法…”——已经向您提供了工作示例。实际上,我还没有将这部分代码与TK代码集成。我只想独立检查udp端口上的任何数据是否可以读取而不会丢失。在这样做的过程中,我只需要确保无论我将要使用什么代码,只要我开始集成这些块,就可以轻松地与主GUI tk代码一起使用。因此,你能建议在这方面的检查方法吗。你的意思是,当我将上面的接收器脚本与TK代码一起使用时,它实际上将从事件循环中调用??那么我在tk代码中的其他工作会停止吗?
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]
}
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]
}