Skip to content

Instantly share code, notes, and snippets.

@madflojo
Last active September 3, 2021 02:23
Show Gist options
  • Save madflojo/e91a7a542d096bdd54293f3583458001 to your computer and use it in GitHub Desktop.
Save madflojo/e91a7a542d096bdd54293f3583458001 to your computer and use it in GitHub Desktop.
SetLinger Article - Basic TCP Server
package main
import (
"log"
"net"
"time"
)
func main() {
// Create a listener
l, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatalf("Listener returned: %s", err)
}
defer l.Close()
for {
// Accept new connections
c, err := l.Accept()
if err != nil {
log.Fatalf("Unable to accept new connections: %s", err)
}
// Create a goroutine that reads and writes-back data
go func() {
log.Printf("TCP Session Open")
// Clean up session when goroutine completes, it's ok to
// call Close more than once.
defer c.Close()
for {
b := make([]byte, 120)
// Read from TCP Buffer
_, err := c.Read(b)
if err != nil {
log.Printf("Error reading TCP Session: %s", err)
break
}
// Write-back data to TCP Client
_, err = c.Write(b)
if err != nil {
log.Printf("Error writing TCP Session: %s", err)
break
}
}
}()
// Create a goroutine that closes a session after 15 seconds
go func() {
<-time.After(time.Duration(15) * time.Second)
defer c.Close()
}()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment