minimcd/conn.go

74 lines
1.8 KiB
Go

package main
import (
"io"
"net"
"sync"
//"time"
)
func handle(client net.Conn) {
defer client.Close()
queryChan := make(QueryChan)
ChanChan <- queryChan
proceed := func() {
server, err := net.Dial("tcp", "127.0.0.1:25565")
if err != nil {
GetLogger().Errorf("Failed to connect to MC server: %v", err)
return
}
// TODO:better way of setting connection timeout
defer server.Close()
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
if _, err := io.Copy(server, client); err != nil {
GetLogger().Errorf("Error forwarding client to server: %v", err)
}
}()
// 从服务器到客户端
go func() {
defer wg.Done()
if _, err := io.Copy(client, server); err != nil {
GetLogger().Errorf("Error forwarding server to client: %v", err)
}
}()
wg.Wait()
GetLogger().Infof("Connection from %s closed", client.RemoteAddr())
}
switch state {
case RUNNING:
CntChan <- INCREASE
defer func() { CntChan <- DECREASE }()
proceed()
case STOPPED, WAITING:
// client.Write([]byte("Server not ready!"))
GetLogger().Warnf("Connection queued, server currently at %s state", stateToStr[state])
CntChan <- INCREASE
defer func() { CntChan <- DECREASE }()
<-RunningChan
proceed()
default:
client.Write([]byte("Server not ready!"))
GetLogger().Warnf("Connection refused, server currently at %s state", stateToStr[state])
}
}
func Listen() {
listener, _ := net.Listen("tcp", "0.0.0.0:"+config.Port)
defer listener.Close()
GetLogger().Infof("Listening on %s", config.Port)
for {
conn, err := listener.Accept()
if err != nil {
GetLogger().Errorf("ection error: %v", err)
continue
}
//conn.SetReadDeadline(time.Now().Add(time.Duration(config.ConnectTimeout) * time.Second))
GetLogger().Infof("New connection from %s", conn.RemoteAddr())
go handle(conn)
}
}