Skip to content

Instantly share code, notes, and snippets.

@marten-seemann
Last active December 18, 2021 13:20
Show Gist options
  • Save marten-seemann/176b6bfc7115cf3984eb6756f35252cf to your computer and use it in GitHub Desktop.
Save marten-seemann/176b6bfc7115cf3984eb6756f35252cf to your computer and use it in GitHub Desktop.
OSX Linger failure
package linger_test
import (
"fmt"
"io"
"math/rand"
"net"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestLinger(t *testing.T) {
ln, err := net.ListenTCP("tcp4", nil)
require.NoError(t, err)
defer ln.Close()
done := make(chan struct{})
accepted := make(chan struct{})
go func() {
defer close(done)
conn, err := ln.Accept()
require.NoError(t, err)
close(accepted)
io.ReadAll(conn)
}()
conn, err := net.DialTCP("tcp4", nil, ln.Addr().(*net.TCPAddr))
require.NoError(t, err)
require.NoError(t, conn.SetLinger(0))
fmt.Printf("%s <-> %s\n", conn.LocalAddr(), conn.RemoteAddr())
go func() {
for {
b := make([]byte, 1+rand.Intn(1000))
_, err := conn.Write(b)
if err != nil {
return
}
time.Sleep(time.Duration(rand.Intn(1000)) * time.Microsecond)
}
}()
<-accepted
time.Sleep(time.Duration(rand.Intn(30)) * time.Millisecond)
require.NoError(t, conn.Close())
select {
case <-done:
case <-time.After(10 * time.Second):
t.Fatal("remote conn didn't close")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment