Skip to content

Instantly share code, notes, and snippets.

@xjdrew
Last active August 13, 2020 03:28
Show Gist options
  • Select an option

  • Save xjdrew/1ac0c03717b0f63b5fdd4aadba1528df to your computer and use it in GitHub Desktop.

Select an option

Save xjdrew/1ac0c03717b0f63b5fdd4aadba1528df to your computer and use it in GitHub Desktop.

Revisions

  1. xjdrew revised this gist Aug 13, 2020. 1 changed file with 17 additions and 0 deletions.
    17 changes: 17 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    ## build
    ```bash
    go build tcpinfo.go
    ```

    ## run
    ```bash
    ./tcpinfo -h
    ./tcpinfo
    ```

    ## feature
    print tcp options, include:
    * Maximum segment size
    * Window scale
    * Selective Acknowledgement
    * others
  2. xjdrew created this gist Aug 13, 2020.
    64 changes: 64 additions & 0 deletions tcpinfo.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    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)
    }
    }