Mercurial > mercurial > hgweb_golang.cgi
changeset 22:5345d67aea5a
ut: add nw/nw.go
author | pyon@macmini |
---|---|
date | Fri, 29 Jun 2018 20:14:29 +0900 |
parents | 4232b4cbeeb5 |
children | a3c8d0b20a60 |
files | src/ut/nw/nw.go |
diffstat | 1 files changed, 62 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ut/nw/nw.go Fri Jun 29 20:14:29 2018 +0900 @@ -0,0 +1,62 @@ +/* + little network library. +*/ +package nw + +import ( + "io" + "log" + "net" + "os" +) + +/* nc: done. */ +func Netcat( server, port string ) { + conn, err := net.Dial( "tcp", net.JoinHostPort( server, port ) ) + if err != nil { + log.Fatal( err ) + } + defer conn.Close() + go mustCopy( os.Stdout, conn ) + mustCopy( conn, os.Stdin ) +} + +func mustCopy( dst io.Writer, src io.Reader ) { + if _, err := io.Copy( dst, src ); err != nil { + log.Fatal( err ) + } +} + +/* nc -l: done. */ +func Netcat_l( port string ) { + addr := GetLocalIP() + l, err := net.Listen( "tcp", net.JoinHostPort( addr, port ) ) + if err != nil { + log.Fatal( err ) + } + defer l.Close() + + conn, err := l.Accept() + if err != nil { + log.Fatal( err ) + } + io.Copy( os.Stdout, conn ) + conn.Close() +} + +/* done. */ +func GetLocalIP() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + log.Fatal( err ) + } + for _, addr := range addrs { + if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + return ipnet.IP.String() + } + } + } + return "127.0.0.1" +} +