package main import ( "bufio" "flag" "fmt" "log" "net" "os" "time" ) var ( port = flag.String("port", "26666", "Port to listen on") logFile = flag.String("logfile", "server.log", "Log file path") ) func main() { flag.Parse() // Open log file file, err := os.OpenFile(*logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { log.Fatal("Failed to open log file:", err) } defer file.Close() // Set log output to both file and console log.SetOutput(file) // Start listening on specified port listener, err := net.Listen("tcp", ":"+*port) if err != nil { log.Fatal("Failed to start server:", err) } defer listener.Close() fmt.Printf("Server listening on port %s\n", *port) log.Printf("Server listening on port %s\n", *port) for { // Accept incoming connections conn, err := listener.Accept() if err != nil { log.Printf("Failed to accept connection: %v", err) continue } // Handle each connection in a separate goroutine go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() // Get connection info remoteAddr := conn.RemoteAddr().(*net.TCPAddr) timestamp := time.Now().Format("2006-01-02 15:04:05") // Print and log connection info connInfo := fmt.Sprintf("New connection from IP: %s, Port: %d, Timestamp: %s", remoteAddr.IP, remoteAddr.Port, timestamp) fmt.Println(connInfo) log.Println(connInfo) // Create a scanner to read messages from the client scanner := bufio.NewScanner(conn) for scanner.Scan() { message := scanner.Text() msgTimestamp := time.Now().Format("2006-01-02 15:04:05") // Print and log the received message with timestamp logEntry := fmt.Sprintf("[%s] Received: %s", msgTimestamp, message) fmt.Println(logEntry) log.Println(logEntry) } if err := scanner.Err(); err != nil { errorMsg := fmt.Sprintf("Error reading from connection: %v", err) fmt.Println(errorMsg) log.Println(errorMsg) } // Log when client disconnects disconnectMsg := fmt.Sprintf("Client %s:%d disconnected", remoteAddr.IP, remoteAddr.Port) fmt.Println(disconnectMsg) log.Println(disconnectMsg) }