go build tcpinfo.go
./tcpinfo -h
./tcpinfo
print tcp options, include:
- Maximum segment size
- Window scale
- Selective Acknowledgement
- others
package main | |
import ( | |
"encoding/json" | |
"flag" | |
"fmt" | |
"log" | |
"net" | |
"github.com/mikioh/tcp" | |
"github.com/mikioh/tcpinfo" | |
) | |
func handleConnection(conn net.Conn, monitor bool) { | |
fmt.Println("new connection:", conn.RemoteAddr()) | |
tc, err := tcp.NewConn(conn) | |
if err != nil { | |
conn.Close() | |
log.Printf("tcp.NewConn failed:", err) | |
return | |
} | |
var o tcpinfo.Info | |
var b [256]byte | |
for { | |
i, err := tc.Option(o.Level(), o.Name(), b[:]) | |
if err != nil { | |
log.Println(err) | |
return | |
} | |
txt, err := json.Marshal(i) | |
if err != nil { | |
log.Println(err) | |
return | |
} | |
fmt.Println(string(txt)) | |
if !monitor { | |
break | |
} | |
} | |
} | |
func main() { | |
listen := flag.String("listen", ":8081", "listen adddress") | |
monitor := flag.Bool("monitor", false, "monitor options") | |
flag.Parse() | |
ln, err := net.Listen("tcp", *listen) | |
if err != nil { | |
log.Printf("listen failed: %s", err) | |
return | |
} | |
log.Println("listen:", *listen) | |
for { | |
conn, err := ln.Accept() | |
if err != nil { | |
// handle error | |
log.Println("accept failed:", err) | |
break | |
} | |
go handleConnection(conn, *monitor) | |
} | |
} |
options: