TCP 接続をリッスンする go-routine があり、これらをチャネルでメイン ループに送り返します。go-routine でこれを行っている理由は、このリッスンをノンブロッキングにし、アクティブな接続を同時に処理できるようにするためです。
これを、次のようなデフォルトのケースが空の select ステートメントで実装しました。
go pollTcpConnections(listener, rawConnections)
for {
// Check for new connections (non-blocking)
select {
case tcpConn := <-rawConnections:
currentCon := NewClientConnection()
pendingConnections.PushBack(currentCon)
fmt.Println(currentCon)
go currentCon.Routine(tcpConn)
default:
}
// ... handle active connections
}
これが私の pollTcpConnections ルーチンです。
func pollTcpConnections(listener net.Listener, rawConnections chan net.Conn) {
for {
conn, err := listener.Accept() // this blocks, afaik
if(err != nil) {
checkError(err)
}
fmt.Println("New connection")
rawConnections<-conn
}
}
問題は、これらの接続をまったく受信しないことです。次のように、ブロックする方法でそれを行う場合:
for {
tcpConn := <-rawConnections
// ...
}
接続を受信しますが、ブロックされます... チャネルもバッファリングしようとしましたが、同じことが起こります。ここで何が欠けていますか?