Skip to content

Instantly share code, notes, and snippets.

@kylemcc
Created February 2, 2013 02:22
Show Gist options
  • Select an option

  • Save kylemcc/4695777 to your computer and use it in GitHub Desktop.

Select an option

Save kylemcc/4695777 to your computer and use it in GitHub Desktop.

Revisions

  1. kylemcc created this gist Feb 2, 2013.
    53 changes: 53 additions & 0 deletions proxy.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    package main

    import (
    "net"
    "fmt"
    "io"
    "os"
    "crypto/sha1"
    "time"
    )

    func main() {
    now := time.Now().Unix()
    nowstr := fmt.Sprintf("%d", now)
    h := sha1.New()
    h.Write([]byte(nowstr))
    fmt.Printf("%v\n", h.Sum(nil));

    if len(os.Args) != 3 {
    fatal("usage: netfwd local remote")
    }

    localAddr := os.Args[1]
    remoteAddr := os.Args[2]

    local, err := net.Listen("tcp", localAddr)
    if local == nil {
    fatal("Cannot listen: %v", err)
    }

    for {
    conn, err := local.Accept()
    if conn == nil {
    fatal("accept failed: %v", err)
    }
    go forward(conn, remoteAddr)
    }
    }

    func forward(local net.Conn, remoteAddr string) {
    remote, err := net.Dial("tcp", remoteAddr)
    if remote == nil {
    fmt.Fprintf(os.Stderr, "remote dial failed: %v\n", err)
    }

    go io.Copy(local, remote)
    go io.Copy(remote, local)
    }

    func fatal(s string, a ... interface{}) {
    fmt.Fprintf(os.Stderr, "netfdw: %s \n", fmt.Sprintf(s, a))
    os.Exit(2)
    }