Top Banner
go for the paranoid network programmer @feyeleanor 1 go for the paranoid network programmer slideshare.net/feyeleanor
203

Go for the paranoid network programmer, 2nd edition

Feb 21, 2017

Download

Software

Eleanor McHugh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Go for the paranoid network programmer, 2nd edition

gofor the paranoid network programmer

@feyeleanor

1go for the paranoid network programmer slideshare.net/feyeleanor

Page 2: Go for the paranoid network programmer, 2nd edition

twitter://@feyeleanor

go for the paranoid network programmer slideshare.net/feyeleanor

Page 3: Go for the paranoid network programmer, 2nd edition

high voltagenetworkingconcurrencycryptography

go for the paranoid network programmer slideshare.net/feyeleanor

Page 4: Go for the paranoid network programmer, 2nd edition

http

4go for the paranoid network programmer slideshare.net/feyeleanor

Page 5: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt""net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {http.HandleFunc("/hello", Hello)if e := http.ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor5

Page 6: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt""net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {http.HandleFunc("/hello", Hello)if e := http.ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor6

Page 7: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor7

Page 8: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". ”net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor8

Page 9: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". ”net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor9

Page 10: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". ”net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor10

Page 11: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". ”net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor11

Page 12: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". ”net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", Hello)if e := ListenAndServe(ADDRESS, nil); e != nil {Println(e)

}}

func Hello(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

}

go for the paranoid network programmer slideshare.net/feyeleanor12

Page 13: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

})ListenAndServe(ADDRESS, nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor13

Page 14: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, MESSAGE)

})ListenAndServe(ADDRESS, nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor14

Page 15: Go for the paranoid network programmer, 2nd edition

https

15go for the paranoid network programmer slideshare.net/feyeleanor

Page 16: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const ADDRESS = ":1025"

func main() {message := "hello world"HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, message)

})ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor16

Page 17: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const ADDRESS = ":1025"

func main() {message := "hello world"HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, message)

})ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor17

Page 18: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const ADDRESS = ":1025"

func main() {message := "hello world"HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, message)

})ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor18

Page 19: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http"

)

const ADDRESS = ":1025"

func main() {message := "hello world"HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, message)

})ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)

}

go for the paranoid network programmer slideshare.net/feyeleanor19

Page 20: Go for the paranoid network programmer, 2nd edition

multiple http servers

20go for the paranoid network programmer slideshare.net/feyeleanor

Page 21: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor21

Page 22: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor22

Page 23: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor23

Page 24: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor24

Page 25: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor25

Page 26: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor26

Page 27: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor27

Page 28: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor28

Page 29: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

done := make(chan bool)go func() {ListenAndServe(":1024", nil)done <- true

}()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)<- done

}

go for the paranoid network programmer slideshare.net/feyeleanor29

Page 30: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

Spawn(func() {ListenAndServe(":1024", nil)

},func() {ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)

},)

}

go for the paranoid network programmer slideshare.net/feyeleanor30

Page 31: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import . "net/http"

func main() {HandleFunc("/hello", func(w ResponseWriter, r *Request) {w.Header().Set("Content-Type", "text/plain")Fprintf(w, "hello world")

})

Spawn(func() {ListenAndServe(":1024", nil)

})Spawn(func() {ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil)

})}

go for the paranoid network programmer slideshare.net/feyeleanor31

Page 32: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for l := len(f); l > 0; l-- {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor32

Page 33: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s) }

for l := len(f); l > 0; l-- {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor33

Page 34: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for l := len(f); l > 0; l-- {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor34

Page 35: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for _, _ = range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor35

Page 36: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor36

Page 37: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor37

Page 38: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor38

Page 39: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor39

Page 40: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor40

Page 41: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) {done := make(chan bool)for _, s := range f {go func(server func()) {server()done <- true

}(s)}

for range f {<- done

}}

go for the paranoid network programmer slideshare.net/feyeleanor41

Page 42: Go for the paranoid network programmer, 2nd edition

waitgroups

42go for the paranoid network programmer slideshare.net/feyeleanor

Page 43: Go for the paranoid network programmer, 2nd edition

package mainimport . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor43

Page 44: Go for the paranoid network programmer, 2nd edition

package mainimport . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor44

Page 45: Go for the paranoid network programmer, 2nd edition

package mainimport . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor45

Page 46: Go for the paranoid network programmer, 2nd edition

package mainimport . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor46

Page 47: Go for the paranoid network programmer, 2nd edition

package mainimport . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor47

Page 48: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http""sync"

)

var servers sync.WaitGroup

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn(func() { ListenAndServe(":1024", nil) }) Spawn(func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }) servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor48

Page 49: Go for the paranoid network programmer, 2nd edition

package mainimport (. "fmt". "net/http""sync"

)

var servers sync.WaitGroup

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn(func() { ListenAndServe(":1024", nil) }) Spawn(func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }) servers.Wait()}

go for the paranoid network programmer slideshare.net/feyeleanor49

Page 50: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) { for _, s := range f { servers.Add(1) go func(server func()) { defer servers.Done() server() }(s) }}

go for the paranoid network programmer slideshare.net/feyeleanor50

Page 51: Go for the paranoid network programmer, 2nd edition

package main

func Spawn(f ...func()) { for _, s := range f { servers.Add(1) go func(server func()) { defer servers.Done() server() }(s) }}

go for the paranoid network programmer slideshare.net/feyeleanor51

Page 52: Go for the paranoid network programmer, 2nd edition

tcp server

52go for the paranoid network programmer slideshare.net/feyeleanor

Page 53: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {if listener, e := net.Listen("tcp", ":1024"); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor53

Page 54: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {if listener, e := net.Listen("tcp", ":1024"); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor54

Page 55: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {if listener, e := net.Listen("tcp", ":1024"); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor55

Page 56: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {if listener, e := net.Listen("tcp", ":1024"); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor56

Page 57: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {if listener, e := net.Listen("tcp", ":1024"); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor57

Page 58: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {Listen("tcp", ":1024", func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

})}

func Listen(p, a string, f func(net.Conn)) (e error) {var listener net.Listenerif listener, e = net.Listen(p, a); e == nil {for {if connection, e := listener.Accept(); e == nil {go f(connection)

}}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor58

Page 59: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {Listen("tcp", ":1024", func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

})}

func Listen(p, a string, f func(net.Conn)) (e error) {var listener net.Listenerif listener, e = net.Listen(p, a); e == nil {for {if connection, e := listener.Accept(); e == nil {go f(connection)

}}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor59

Page 60: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {Listen("tcp", ":1024", func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

})}

func Listen(p, a string, f func(net.Conn)) (e error) {var listener net.Listenerif listener, e = net.Listen(p, a); e == nil {for {if connection, e := listener.Accept(); e == nil {go f(connection)

}}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor60

Page 61: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

func main() {Listen("tcp", ":1024", func(c net.Conn) {defer c.Close()Fprintln(c, "hello world")

})}

func Listen(p, a string, f func(net.Conn)) (e error) {var listener net.Listenerif listener, e = net.Listen(p, a); e == nil {for {if connection, e := listener.Accept(); e == nil {go f(connection)

}}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor61

Page 62: Go for the paranoid network programmer, 2nd edition

tcp client

62go for the paranoid network programmer slideshare.net/feyeleanor

Page 63: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor63

Page 64: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor64

Page 65: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor65

Page 66: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor66

Page 67: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor67

Page 68: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {if c, e := net.Dial("tcp", ":1024"); e == nil {defer c.Close()if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor68

Page 69: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial("tcp", ":1024", func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func Dial(p, a string, f func(net.Conn)) (e error) {var c net.Connif c, e = net.Dial(p, a); e == nil {defer c.Close()f(c)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor69

Page 70: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial("tcp", ":1024", func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func Dial(p, a string, f func(net.Conn)) (e error) {var c net.Connif c, e = net.Dial(p, a); e == nil {defer c.Close()f(c)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor70

Page 71: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial("tcp", ":1024", func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func Dial(p, a string, f func(net.Conn)) (e error) {var c net.Connif c, e = net.Dial(p, a); e == nil {defer c.Close()f(c)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor71

Page 72: Go for the paranoid network programmer, 2nd edition

tcp/tls server

72go for the paranoid network programmer slideshare.net/feyeleanor

Page 73: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor73

Page 74: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor74

Page 75: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor75

Page 76: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor76

Page 77: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor77

Page 78: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/tls"import . "fmt"

func main() {Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) {Fprintln(c, "hello world")

})}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },Rand: rand.Reader,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor78

Page 79: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor79

Page 80: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor80

Page 81: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor81

Page 82: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor82

Page 83: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor83

Page 84: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c *tls.Conn) {defer c.Close()f(c)

}(connection.(*tls.Conn))}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor84

Page 85: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"import "net"

func Listen(a string, conf *tls.Config, f func(net.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()f(c)

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor85

Page 86: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"import "net"

func Listen(a string, conf *tls.Config, f func(net.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if connection, e := listener.Accept(); e == nil {go func(c net.Conn) {defer c.Close()f(c)

}(connection)}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor86

Page 87: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/tls"import "net"

func Listen(a string, conf *tls.Config, f func(net.Conn)) {if listener, e := tls.Listen("tcp", a, conf); e == nil {for {if c, e := listener.Accept(); e == nil {go Handle(c, f)

}}

}}

func Handle(c net.Conn, f func(net.Conn)) {defer c.Close()f(c)

}

go for the paranoid network programmer slideshare.net/feyeleanor87

Page 88: Go for the paranoid network programmer, 2nd edition

tcp/tls client

88go for the paranoid network programmer slideshare.net/feyeleanor

Page 89: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net"

func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor89

Page 90: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor90

Page 91: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor91

Page 92: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor92

Page 93: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor93

Page 94: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func ConfigTLS(c, k string) (r *tls.Config) {if cert, e := tls.LoadX509KeyPair(c, k); e == nil {r = &tls.Config{Certificates: []tls.Certificate{ cert },InsecureSkipVerify: true,

}}return

}

go for the paranoid network programmer slideshare.net/feyeleanor94

Page 95: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func Dial(a string, conf *tls.Config, f func(net.Conn)) { if c, e := tls.Dial("tcp", a, conf); e == nil { defer c.Close() f(c) }}

go for the paranoid network programmer slideshare.net/feyeleanor95

Page 96: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import "crypto/tls"import . "fmt"import "net" func main() {Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) {if m, e := bufio.NewReader(c).ReadString('\n'); e == nil {Printf(m)

}})

}

func Dial(a string, conf *tls.Config, f func(net.Conn)) { if c, e := tls.Dial("tcp", a, conf); e == nil { defer c.Close() f(c) }}

go for the paranoid network programmer slideshare.net/feyeleanor96

Page 97: Go for the paranoid network programmer, 2nd edition

udp serve

97go for the paranoid network programmer slideshare.net/feyeleanor

Page 98: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor98

Page 99: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor99

Page 100: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor100

Page 101: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor101

Page 102: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor102

Page 103: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor103

Page 104: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor104

Page 105: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor105

Page 106: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor106

Page 107: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func main() {HELLO_WORLD := []byte("Hello World\n")Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {c.WriteToUDP(HELLO_WORLD, a)

})}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := conn.ReadFromUDP(b); e == nil {go f(conn, client, b[:n])

}}

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor107

Page 108: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor108

Page 109: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor109

Page 110: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor110

Page 111: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor111

Page 112: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor112

Page 113: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor113

Page 114: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.ListenUDP("udp", address); e == nil {ServeUDP(conn, func(c *net.UDPAddr, b []byte) {f(conn, c, b)

})}

}}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {for b := make([]byte, 1024); ; b = make([]byte, 1024) {if n, client, e := c.ReadFromUDP(b); e == nil {go f(client, b[:n])

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor114

Page 115: Go for the paranoid network programmer, 2nd edition

udp request

115go for the paranoid network programmer slideshare.net/feyeleanor

Page 116: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor116

Page 117: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor117

Page 118: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor118

Page 119: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor119

Page 120: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor120

Page 121: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor121

Page 122: Go for the paranoid network programmer, 2nd edition

package mainimport "bufio"import . "fmt"import "net"

func main() {Dial(":1024", func(conn net.Conn) {if _, e := conn.Write([]byte("\n")); e == nil {if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil {Printf("%v", m)

}}

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor122

Page 123: Go for the paranoid network programmer, 2nd edition

aes encrypt

123go for the paranoid network programmer slideshare.net/feyeleanor

Page 124: Go for the paranoid network programmer, 2nd edition

go for the paranoid network programmer slideshare.net/feyeleanor124

package mainimport "net"

const AES_KEY = "0123456789012345"

func main() {Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {if m, e := Encrypt("Hello World", AES_KEY); e == nil {c.WriteToUDP(m, a)

}})

}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {// see udp serve

}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {// see udp serve

}

Page 125: Go for the paranoid network programmer, 2nd edition

go for the paranoid network programmer slideshare.net/feyeleanor125

package mainimport "net"

const AES_KEY = "0123456789012345"

func main() {Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {if m, e := Encrypt("Hello World", AES_KEY); e == nil {c.WriteToUDP(m, a)

}})

}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {// see udp serve

}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {// see udp serve

}

Page 126: Go for the paranoid network programmer, 2nd edition

go for the paranoid network programmer slideshare.net/feyeleanor126

package mainimport "net"

const AES_KEY = "0123456789012345"

func main() {Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {if m, e := Encrypt("Hello World", AES_KEY); e == nil {c.WriteToUDP(m, a)

}})

}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {// see udp serve

}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {// see udp serve

}

Page 127: Go for the paranoid network programmer, 2nd edition

go for the paranoid network programmer slideshare.net/feyeleanor127

package mainimport "net"

const AES_KEY = "0123456789012345"

func main() {Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) {if m, e := Encrypt("Hello World", AES_KEY); e == nil {c.WriteToUDP(m, a)

}})

}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) {// see udp serve

}

func ServeUDP(c *net.UDPConn, f func(*net.UDPAddr, []byte)) {// see udp serve

}

Page 128: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)…) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor128

Page 129: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)…) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor129

Page 130: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)…) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor130

Page 131: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)…) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor131

Page 132: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)…) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor132

Page 133: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)...) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor133

Page 134: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)...) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor134

Page 135: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)...) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor135

Page 136: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func Encrypt(m, k string) (o []byte, e error) {if o, e = PaddedBuffer([]byte(m)); e == nil {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {o = CryptBlocks(o, b)

}}return

}

func PaddedBuffer(m []byte) (b []byte, e error) {b = append(b, m...)if p := len(b) % aes.BlockSize; p != 0 {p = aes.BlockSize - pb = append(b, make([]byte, p)...) // padding with NUL!!!!

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor136

Page 137: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor137

Page 138: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor138

Page 139: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor139

Page 140: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor140

Page 141: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor141

Page 142: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor142

Page 143: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor143

Page 144: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/aes"import "crypto/cipher"

func CryptBlocks(b []byte, c cipher.Block) (o []byte) {o = make([]byte, aes.BlockSize + len(b))copy(o, IV())enc := cipher.NewCBCEncrypter(c, o[:aes.BlockSize])enc.CryptBlocks(o[aes.BlockSize:], b)return

}

func IV() (b []byte) {b = make([]byte, aes.BlockSize)if _, e := rand.Read(b); e != nil {panic(e)

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor144

Page 145: Go for the paranoid network programmer, 2nd edition

aes decrypt

145go for the paranoid network programmer slideshare.net/feyeleanor

Page 146: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() {Dial(":1025", func(conn net.Conn) {RequestMessage(conn, func(m []byte) {if m, e := Decrypt(m, AES_KEY); e == nil {Printf("%s\n", m)

}})

})}

func Dial(a string, f func(net.Conn)) {if address, e := net.ResolveUDPAddr("udp", a); e == nil {if conn, e := net.DialUDP("udp", nil, address); e == nil {defer conn.Close()f(conn)

}}

}

go for the paranoid network programmer slideshare.net/feyeleanor146

Page 147: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() {Dial(":1025", func(conn net.Conn) {RequestMessage(conn, func(m []byte) {if m, e := Decrypt(m, AES_KEY); e == nil {Printf("%s\n", m)

}})

})}

func Dial(a string, f func(net.Conn)) {// see udp request

}

go for the paranoid network programmer slideshare.net/feyeleanor147

Page 148: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() {Dial(":1025", func(conn net.Conn) {RequestMessage(conn, func(m []byte) {if m, e := Decrypt(m, AES_KEY); e == nil {Printf("%s\n", m)

}})

})}

func Dial(a string, f func(net.Conn)) {// see udp request

}

go for the paranoid network programmer slideshare.net/feyeleanor148

Page 149: Go for the paranoid network programmer, 2nd edition

package mainimport . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() {Dial(":1025", func(conn net.Conn) {RequestMessage(conn, func(m []byte) {if m, e := Decrypt(m, AES_KEY); e == nil {Printf("%s\n", m)

}})

})}

func Dial(a string, f func(net.Conn)) {// see udp request

}

go for the paranoid network programmer slideshare.net/feyeleanor149

Page 150: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func RequestMessage(conn net.Conn, f func([]byte)) (e error) {if _, e = conn.Write([]byte("\n")); e == nil {

m := make([]byte, 1024)var n intif n, e = conn.Read(m); e == nil {

f(m[:n])}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor150

Page 151: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func RequestMessage(conn net.Conn, f func([]byte)) (e error) {if _, e = conn.Write([]byte("\n")); e == nil {

m := make([]byte, 1024)var n intif n, e = conn.Read(m); e == nil {

f(m[:n])}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor151

Page 152: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func RequestMessage(conn net.Conn, f func([]byte)) (e error) {if _, e = conn.Write([]byte("\n")); e == nil {

m := make([]byte, 1024)var n intif n, e = conn.Read(m); e == nil {

f(m[:n])}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor152

Page 153: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func RequestMessage(conn net.Conn, f func([]byte)) (e error) {if _, e = conn.Write([]byte("\n")); e == nil {

m := make([]byte, 1024)var n intif n, e = conn.Read(m); e == nil {

f(m[:n])}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor153

Page 154: Go for the paranoid network programmer, 2nd edition

package mainimport "net"

func RequestMessage(conn net.Conn, f func([]byte)) (e error) {if _, e = conn.Write([]byte("\n")); e == nil {

m := make([]byte, 1024)var n intif n, e = conn.Read(m); e == nil {

f(m[:n])}

}return

}

go for the paranoid network programmer slideshare.net/feyeleanor154

Page 155: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor155

Page 156: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor156

Page 157: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor157

Page 158: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor158

Page 159: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor159

Page 160: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor160

Page 161: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor161

Page 162: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/cipher"import "crypto/aes"

func Decrypt(m []byte, k string) (r []byte, e error) {var b cipher.Blockif b, e = aes.NewCipher([]byte(k)); e == nil {var iv []byteiv, m = Unpack(m)c := cipher.NewCBCDecrypter(b, iv)r = make([]byte, len(m))c.CryptBlocks(r, m)

}return

}

func Unpack(m []byte) (iv, r []byte){return m[:aes.BlockSize], m[aes.BlockSize:]

}

go for the paranoid network programmer slideshare.net/feyeleanor162

Page 163: Go for the paranoid network programmer, 2nd edition

rsa encrypt

163go for the paranoid network programmer slideshare.net/feyeleanor

Page 164: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor164

Page 165: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor165

Page 166: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor166

Page 167: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor167

Page 168: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor168

Page 169: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor169

Page 170: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor170

Page 171: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor171

Page 172: Go for the paranoid network programmer, 2nd edition

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the paranoid network programmer slideshare.net/feyeleanor172

Page 173: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor173

Page 174: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor174

Page 175: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor175

Page 176: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor176

Page 177: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor177

Page 178: Go for the paranoid network programmer, 2nd edition

rsa decrypt

178go for the paranoid network programmer slideshare.net/feyeleanor

Page 179: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the paranoid network programmer slideshare.net/feyeleanor179

Page 180: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the paranoid network programmer slideshare.net/feyeleanor180

Page 181: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the paranoid network programmer slideshare.net/feyeleanor181

Page 182: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Decrypt(key *rsa.PrivateKey, m, l []byte) ([]byte, error) { return rsa.DecryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the paranoid network programmer slideshare.net/feyeleanor182

Page 183: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the paranoid network programmer slideshare.net/feyeleanor183

Page 184: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the paranoid network programmer slideshare.net/feyeleanor184

Page 185: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor185

Page 186: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor186

Page 187: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor187

Page 188: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor188

Page 189: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor189

Page 190: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor190

Page 191: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor191

Page 192: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor192

Page 193: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the paranoid network programmer slideshare.net/feyeleanor193

Page 194: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor194

Page 195: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor195

Page 196: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor196

Page 197: Go for the paranoid network programmer, 2nd edition

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the paranoid network programmer slideshare.net/feyeleanor197

Page 198: Go for the paranoid network programmer, 2nd edition

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the paranoid network programmer slideshare.net/feyeleanor198

Page 199: Go for the paranoid network programmer, 2nd edition

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the paranoid network programmer slideshare.net/feyeleanor199

Page 200: Go for the paranoid network programmer, 2nd edition

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the paranoid network programmer slideshare.net/feyeleanor200

Page 201: Go for the paranoid network programmer, 2nd edition

http://golang.org/

go for the paranoid network programmer slideshare.net/feyeleanor201

Page 202: Go for the paranoid network programmer, 2nd edition

twitter://#golang

go for the paranoid network programmer slideshare.net/feyeleanor202

Page 203: Go for the paranoid network programmer, 2nd edition

twitter://@feyeleanor

go for the paranoid network programmer slideshare.net/feyeleanor