Guest User

Untitled

a guest
Mar 15th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.62 KB | None | 0 0
  1. package net_test
  2.  
  3. import (
  4.     "fmt"
  5.     "math/rand"
  6.     "net"
  7.     "sync"
  8.     "testing"
  9. )
  10.  
  11. const (
  12.     ndialers = 100
  13.     nlisteners = 100
  14.     nconn = 100000
  15. )
  16.  
  17. func TestAccept(t *testing.T) {
  18.     listeners := []net.Listener{}
  19.     for k := 0; k < nlisteners; k++ {
  20.         l, err := net.ListenTCP("tcp", &net.TCPAddr{})
  21.         if err != nil {
  22.             panic("Listen failed: " + err.Error())
  23.         }
  24.         listeners = append(listeners, l)
  25.     }
  26.    
  27.     // start dialers
  28.     var dialWg sync.WaitGroup
  29.     for k := 0; k < ndialers; k++ {
  30.         dialWg.Add(1)
  31.         go func() {
  32.             rng := rand.New(rand.NewSource(int64(k)))
  33.             defer dialWg.Done()
  34.             for j := 0; j < nconn; j++ {
  35.                 l := listeners[rng.Intn(len(listeners))]
  36.                 fmt.Printf("Dialing %v\n", l.Addr())
  37.                 c, err := net.Dial("tcp", l.Addr().String())
  38.                 if err != nil {
  39.                     panic("Dial failed: " + err.Error())
  40.                 }
  41.                 tc := c.(*net.TCPConn)
  42.                 if err := tc.SetLinger(0); err != nil {
  43.                     panic(err)
  44.                 }
  45.                 if err := c.Close(); err != nil {
  46.                     panic(err)
  47.                 }
  48.             }
  49.         }()
  50.     }
  51.  
  52.     // accept on listeners
  53.     var listenWg sync.WaitGroup
  54.     for _, listener := range listeners {
  55.         listenWg.Add(1)
  56.         l := listener
  57.         go func() {
  58.             defer listenWg.Done()
  59.             for {
  60.                 fmt.Printf("Accepting on %v\n", l.Addr())
  61.                 c, err := l.Accept()
  62.                 if err != nil {
  63.                     break
  64.                 }
  65.                 tc := c.(*net.TCPConn)
  66.                 if err := tc.SetLinger(0); err != nil {
  67.                     panic(err)
  68.                 }
  69.                 if err := c.Close(); err != nil {
  70.                     panic(err)
  71.                 }
  72.             }
  73.         }()
  74.     }
  75.  
  76.     dialWg.Wait()
  77.  
  78.     for _, l := range listeners {
  79.         if err := l.Close(); err != nil {
  80.             panic("listener close failed: " + err.Error())
  81.         }
  82.     }
  83.  
  84.     listenWg.Wait()
  85. }
Add Comment
Please, Sign In to add comment