Dear Vladimir,
On 01.02.23 19:47, Vladimir wrote:
Sorry for ugly formatting. I do not know what is happened. Source of example in attachment.
The formatting was not so bad, but the yellow markup was missing. Below is an implementation of the logic of your echo server in nx.
The callback methods have to be public, since these are called from the Tcl event loop, i.e. outside of the server object scope. Therefore the callback methods "accept" and "echo" are required to be public.
Probably, it would be possible to implement a variant of ":callback "without this requirement, using some internal nsf magic, but i am not sure this would be good.
Hope this helps!
-gn
====================================================================== #!/usr/bin/env tclsh package require nx::trait
namespace eval ::proj {
nx::Class create Server { set :version 0.1
:property port:integer :require trait nx::trait::callback
:method log {msg} { puts stderr "[namespace current]::Server ([self]): $msg" }
:method init {} { :log "Init mock Server [set [current class]::version]" set :listen [socket -server [:callback accept] ${:port}] }
:method destroy {} { close ${:listen} next }
:public method accept {sock addr localport} { :log "accept $sock $addr $localport" fconfigure $sock -translation binary -buffering none fileevent $sock readable [:callback echo $sock] }
:public method echo {sock} { :log "... $sock echo" if { [eof $sock] } { close $sock :log "... $sock close" } else { set binary_msg [read $sock 2] binary scan $binary_msg "H*" string_msg :log "... $sock read 2 bytes 0x$string_msg" if {[string length $string_msg] > 0} { :log "... $sock echo" puts -nonewline $sock $binary_msg } } } } }
set s [proj::Server new -port 1950] vwait forever ======================================================================