|
|
@ -92,7 +92,7 @@ var broadcastMsg chan chatMsg |
|
|
|
// Telnet
|
|
|
|
var wantsServerHello chan bufferedConn |
|
|
|
var authTelnet chan telnetUser |
|
|
|
var cleanTelnet chan telnetUser |
|
|
|
var cleanTelnet chan telnetUser // intentionally blocking
|
|
|
|
|
|
|
|
// HTTP
|
|
|
|
var demuxHttpClient chan bufferedConn |
|
|
@ -101,7 +101,7 @@ var valAuthReqs chan authReq |
|
|
|
var delAuthReqs chan authReq |
|
|
|
|
|
|
|
func usage() { |
|
|
|
fmt.Fprintf(os.Stderr, "\nusage: go run chatserver.go\n") |
|
|
|
fmt.Fprintf(os.Stderr, "\nusage: go run chatserver*.go\n") |
|
|
|
flag.PrintDefaults() |
|
|
|
fmt.Println() |
|
|
|
|
|
|
@ -301,7 +301,7 @@ func main() { |
|
|
|
virginConns = make(chan net.Conn, 128) |
|
|
|
|
|
|
|
// TCP & Authentication
|
|
|
|
telnetConns := make(map[bufferedConn]telnetUser) |
|
|
|
telnetConns := make(map[string]telnetUser) |
|
|
|
wantsServerHello = make(chan bufferedConn, 128) |
|
|
|
authTelnet = make(chan telnetUser, 128) |
|
|
|
|
|
|
@ -389,7 +389,12 @@ func main() { |
|
|
|
case u := <-authTelnet: |
|
|
|
// allow to receive messages
|
|
|
|
// (and be counted among the users)
|
|
|
|
telnetConns[u.bufConn] = u |
|
|
|
_, ok := telnetConns[u.email] |
|
|
|
if ok { |
|
|
|
// this is a blocking channel, and that's important
|
|
|
|
cleanTelnet <- telnetConns[u.email] |
|
|
|
} |
|
|
|
telnetConns[u.email] = u |
|
|
|
// is chan chan the right way to handle this?
|
|
|
|
u.userCount <- len(telnetConns) |
|
|
|
broadcastMsg <- chatMsg{ |
|
|
@ -422,7 +427,7 @@ func main() { |
|
|
|
close(u.newMsg) |
|
|
|
// we can safely ignore this error, if any
|
|
|
|
u.bufConn.Close() |
|
|
|
delete(telnetConns, u.bufConn) |
|
|
|
delete(telnetConns, u.email) |
|
|
|
case bufConn := <-gotClientHello: |
|
|
|
go muxTcp(bufConn) |
|
|
|
case bufConn := <-demuxHttpClient: |
|
|
|