Skip to content

Instantly share code, notes, and snippets.

@joesis
Created January 17, 2020 05:12
Show Gist options
  • Save joesis/340e21f44cc65e2119668d116f397e49 to your computer and use it in GitHub Desktop.
Save joesis/340e21f44cc65e2119668d116f397e49 to your computer and use it in GitHub Desktop.
To demonstrate the case that all streams get read error after one read time out
package main
import (
"log"
"net"
"time"
"github.com/xtaci/smux"
)
func main() {
listener, err := net.Listen("tcp", ":0")
if err != nil {
panic(err)
}
go server(listener)
client(listener.Addr().String())
}
func client(addr string) {
conn, err := net.Dial("tcp", addr)
if err != nil {
panic(err)
}
session, err := smux.Client(conn, nil)
if err != nil {
panic(err)
}
defer session.Close()
for {
time.Sleep(time.Second)
conn.SetReadDeadline(time.Now().Add(time.Second))
stream, err := session.OpenStream()
if err != nil {
log.Printf("Error opening stream: %v", err)
break
}
// Stream implements io.ReadWriteCloser
nw, ew := stream.Write([]byte("ping"))
buf := make([]byte, 4)
nr, er := stream.Read(buf)
log.Printf("client: read %v, err %v, wrote %v, err %v", nr, er, nw, ew)
stream.Close()
}
}
func server(listener net.Listener) {
conn, err := listener.Accept()
if err != nil {
panic(err)
}
session, err := smux.Server(conn, nil)
if err != nil {
panic(err)
}
for i := 0; ; i++ {
// to simulate the case of packet retransmission
if i%10 == 0 {
time.Sleep(5 * time.Second)
}
stream, err := session.AcceptStream()
if err != nil {
log.Printf("err AcceptStream: %v", err)
break
}
buf := make([]byte, 4)
nr, er := stream.Read(buf)
nw, ew := stream.Write([]byte("pong"))
log.Printf("server: read %v, err %v, wrote %v, err %v", nr, er, nw, ew)
stream.Close()
}
log.Print("Closing server side session")
session.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment