proc read_socket {sock} { set pdu [read $sock] if {[catch {binary scan $pdu ccc d(disver) d(exercise) d(kind)}]} {return} switch -- $d(kind) { 1 { # ENTITY STATE catch {binary scan $pdu ccccISSSSSccccSccccccSccccIIIWWWIIIIcA39cA11I \ d(disver) d(exercise) d(kind) d(family) d(time) d(length) pad \ d(site) d(host) d(ent) d(force) d(art) \ d(kind) d(domain) d(country) d(cat) d(subcat) d(spec) d(extra) \ d(altkind) d(altdomain) d(altcountry) d(altcat) d(altsubcat) d(altspec) d(altextra) \ d(velx) d(vely) d(velz) d(locx) d(locy) d(locz) d(orientx) d(orienty) d(orientz) \ d(appearance) d(dra) pad d(charset) d(marking) d(cap)} result } 2 { # FIRE catch {binary scan $pdu ccccISSSSSSSSSSSSSSIWWWccSccccSSSSIIII \ d(disver) d(exercise) d(kind) d(family) d(time) d(length) 0 \ d(site) d(host) d(ent) d(sitetgt) d(hosttgt) d(enttgt) \ d(sitemun) d(hostmun) d(entmun) d(siteevt) d(hostevt) d(entevt) \ d(mission) d(locx) d(locy) d(locz) \ d(kind) d(domain) d(country) d(cat) d(subcat) d(spec) d(extra) \ d(warhead) d(fuze) d(quantity) d(rate) d(velx) d(vely) d(velz) d(range)} result } 3 { # DETONATION catch {binary scan $pdu ccccISSSSSSSSSSSSSSIIIWWWccSccccSSSSIIIccS \ d(disver) d(exercise) d(kind) d(family) d(time) d(length) 0 \ d(site) d(host) d(ent) d(sitetgt) d(hosttgt) d(enttgt) \ d(sitemun) d(hostmun) d(entmun) d(siteevt) d(hostevt) d(entevt) \ d(velx) d(vely) d(velz) d(locx) d(locy) d(locz) \ d(kind) d(domain) d(country) d(cat) d(subcat) d(spec) d(extra) \ d(warhead) d(fuze) d(quantity) d(rate) d(entx) d(enty) d(entz) d(result) \ d(parts) d(art)} result } } }