Skip to content

Instantly share code, notes, and snippets.

@madflojo
Created September 1, 2021 14:42
Show Gist options
  • Save madflojo/fbf7ae39689a0f4014093cae652488c3 to your computer and use it in GitHub Desktop.
Save madflojo/fbf7ae39689a0f4014093cae652488c3 to your computer and use it in GitHub Desktop.
SetLinger Article - TCP Server with SetLinger
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)
// Use SetLinger to force close the connection
err := c.(*net.TCPConn).SetLinger(0)
if err != nil {
log.Printf("Error when setting linger: %s", err)
}
defer c.Close()
}()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment