159
go for the would-be network programmer @feyeleanor 1 go for the would-be network programmer http://slides.games-with-brains.net/

Go for the would be network programmer

Embed Size (px)

Citation preview

gofor the would-be network programmer

@feyeleanor

1go for the would-be network programmer http://slides.games-with-brains.net/

twitter://@feyeleanor

leanpub://GoNotebook

go for the would-be network programmer http://slides.games-with-brains.net/

high voltagenetworking concurrency cryptography

go for the would-be network programmer http://slides.games-with-brains.net/

http

4go for the would-be network programmer http://slides.games-with-brains.net/

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 would-be network programmer http://slides.games-with-brains.net/5

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 would-be network programmer http://slides.games-with-brains.net/6

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 would-be network programmer http://slides.games-with-brains.net/7

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 would-be network programmer http://slides.games-with-brains.net/8

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 would-be network programmer http://slides.games-with-brains.net/9

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 would-be network programmer http://slides.games-with-brains.net/10

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 would-be network programmer http://slides.games-with-brains.net/11

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 would-be network programmer http://slides.games-with-brains.net/12

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 would-be network programmer http://slides.games-with-brains.net/13

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 would-be network programmer http://slides.games-with-brains.net/14

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 would-be network programmer http://slides.games-with-brains.net/15

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 would-be network programmer http://slides.games-with-brains.net/16

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 would-be network programmer http://slides.games-with-brains.net/17

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 would-be network programmer http://slides.games-with-brains.net/18

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 would-be network programmer http://slides.games-with-brains.net/19

concurrency

20go for the would-be network programmer http://slides.games-with-brains.net/

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 would-be network programmer http://slides.games-with-brains.net/21

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 would-be network programmer http://slides.games-with-brains.net/22

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 would-be network programmer http://slides.games-with-brains.net/23

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 would-be network programmer http://slides.games-with-brains.net/24

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 would-be network programmer http://slides.games-with-brains.net/25

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 would-be network programmer http://slides.games-with-brains.net/26

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 would-be network programmer http://slides.games-with-brains.net/27

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 would-be network programmer http://slides.games-with-brains.net/28

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 would-be network programmer http://slides.games-with-brains.net/29

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 would-be network programmer http://slides.games-with-brains.net/30

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 would-be network programmer http://slides.games-with-brains.net/31

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 would-be network programmer http://slides.games-with-brains.net/32

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 would-be network programmer http://slides.games-with-brains.net/33

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 would-be network programmer http://slides.games-with-brains.net/34

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 would-be network programmer http://slides.games-with-brains.net/35

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 would-be network programmer http://slides.games-with-brains.net/36

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 would-be network programmer http://slides.games-with-brains.net/37

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 would-be network programmer http://slides.games-with-brains.net/38

waitgroups

39go for the would-be network programmer http://slides.games-with-brains.net/

package mainimport . "fmt"import . "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 would-be network programmer http://slides.games-with-brains.net/40

package mainimport . "fmt"import . "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 would-be network programmer http://slides.games-with-brains.net/41

package mainimport . "fmt"import . "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 would-be network programmer http://slides.games-with-brains.net/42

package mainimport . "fmt"import . "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 would-be network programmer http://slides.games-with-brains.net/43

package mainimport . "fmt"import . "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 would-be network programmer http://slides.games-with-brains.net/44

package mainimport . "fmt"import . "net/http"import "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 would-be network programmer http://slides.games-with-brains.net/45

package mainimport . "fmt"import . "net/http"import "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 would-be network programmer http://slides.games-with-brains.net/46

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 would-be network programmer http://slides.games-with-brains.net/47

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 would-be network programmer http://slides.games-with-brains.net/48

tcp

49go for the would-be network programmer http://slides.games-with-brains.net/

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 would-be network programmer http://slides.games-with-brains.net/50

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 would-be network programmer http://slides.games-with-brains.net/51

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 would-be network programmer http://slides.games-with-brains.net/52

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 would-be network programmer http://slides.games-with-brains.net/53

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 would-be network programmer http://slides.games-with-brains.net/54

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.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/55

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.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/56

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.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/57

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.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/58

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 would-be network programmer http://slides.games-with-brains.net/59

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 would-be network programmer http://slides.games-with-brains.net/60

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 would-be network programmer http://slides.games-with-brains.net/61

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 would-be network programmer http://slides.games-with-brains.net/62

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 would-be network programmer http://slides.games-with-brains.net/63

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 would-be network programmer http://slides.games-with-brains.net/64

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) } })}

go for the would-be network programmer http://slides.games-with-brains.net/65

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.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/66

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.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/67

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.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/68

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.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/69

tcp/tls

70go for the would-be network programmer http://slides.games-with-brains.net/

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

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

go for the would-be network programmer http://slides.games-with-brains.net/71

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

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

go for the would-be network programmer http://slides.games-with-brains.net/72

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

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

go for the would-be network programmer http://slides.games-with-brains.net/73

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

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 would-be network programmer http://slides.games-with-brains.net/74

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

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 would-be network programmer http://slides.games-with-brains.net/75

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

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 would-be network programmer http://slides.games-with-brains.net/76

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

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 would-be network programmer http://slides.games-with-brains.net/77

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

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 would-be network programmer http://slides.games-with-brains.net/78

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 would-be network programmer http://slides.games-with-brains.net/79

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 would-be network programmer http://slides.games-with-brains.net/80

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 would-be network programmer http://slides.games-with-brains.net/81

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 would-be network programmer http://slides.games-with-brains.net/82

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 would-be network programmer http://slides.games-with-brains.net/83

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 would-be network programmer http://slides.games-with-brains.net/84

package mainimport "bufio"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) } })}

go for the would-be network programmer http://slides.games-with-brains.net/85

package mainimport "bufio"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) } })}

go for the would-be network programmer http://slides.games-with-brains.net/86

package mainimport "bufio"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) } })}

go for the would-be network programmer http://slides.games-with-brains.net/87

package mainimport "crypto/tls"

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 would-be network programmer http://slides.games-with-brains.net/88

package mainimport "crypto/tls"

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 would-be network programmer http://slides.games-with-brains.net/89

package mainimport "crypto/tls"

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 would-be network programmer http://slides.games-with-brains.net/90

package mainimport “crypto/tls"import "net"

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 would-be network programmer http://slides.games-with-brains.net/91

package mainimport “crypto/tls"import "net"

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 would-be network programmer http://slides.games-with-brains.net/92

udp

93go for the would-be network programmer http://slides.games-with-brains.net/

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/94

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/95

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/96

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/97

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/98

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/99

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/100

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/101

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/102

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/103

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/104

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/105

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/106

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/107

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 would-be network programmer http://slides.games-with-brains.net/108

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 would-be network programmer http://slides.games-with-brains.net/109

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 would-be network programmer http://slides.games-with-brains.net/110

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 would-be network programmer http://slides.games-with-brains.net/111

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 would-be network programmer http://slides.games-with-brains.net/112

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 would-be network programmer http://slides.games-with-brains.net/113

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 would-be network programmer http://slides.games-with-brains.net/114

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 would-be network programmer http://slides.games-with-brains.net/115

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 would-be network programmer http://slides.games-with-brains.net/116

rsa

117go for the would-be network programmer http://slides.games-with-brains.net/

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]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/118

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 would-be network programmer http://slides.games-with-brains.net/119

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 would-be network programmer http://slides.games-with-brains.net/120

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 would-be network programmer http://slides.games-with-brains.net/121

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 would-be network programmer http://slides.games-with-brains.net/122

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 would-be network programmer http://slides.games-with-brains.net/123

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 would-be network programmer http://slides.games-with-brains.net/124

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 would-be network programmer http://slides.games-with-brains.net/125

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 would-be network programmer http://slides.games-with-brains.net/126

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 would-be network programmer http://slides.games-with-brains.net/127

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 would-be network programmer http://slides.games-with-brains.net/128

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 would-be network programmer http://slides.games-with-brains.net/129

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 would-be network programmer http://slides.games-with-brains.net/130

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 would-be network programmer http://slides.games-with-brains.net/131

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 would-be network programmer http://slides.games-with-brains.net/132

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 would-be network programmer http://slides.games-with-brains.net/133

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 would-be network programmer http://slides.games-with-brains.net/134

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 would-be network programmer http://slides.games-with-brains.net/135

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 would-be network programmer http://slides.games-with-brains.net/136

package mainimport "net"

func ReadStream(conn *net.UDPConn) (r []byte, e error) { m := make([]byte, 1024) var n int if n, e = conn.Read(m); e == nil { r = m[:n] } return}

go for the would-be network programmer http://slides.games-with-brains.net/137

package mainimport "net"

func ReadStream(conn *net.UDPConn) (r []byte, e error) { m := make([]byte, 1024) var n int if n, e = conn.Read(m); e == nil { r = m[:n] } return}

go for the would-be network programmer http://slides.games-with-brains.net/138

package mainimport "net"

func ReadStream(conn *net.UDPConn) (r []byte, e error) { m := make([]byte, 1024) var n int if n, e = conn.Read(m); e == nil { r = m[:n] } return}

go for the would-be network programmer http://slides.games-with-brains.net/139

package mainimport "net"

func ReadStream(conn *net.UDPConn) (r []byte, e error) { m := make([]byte, 1024) var n int if n, e = conn.Read(m); e == nil { r = m[:n] } return}

go for the would-be network programmer http://slides.games-with-brains.net/140

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 would-be network programmer http://slides.games-with-brains.net/141

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 would-be network programmer http://slides.games-with-brains.net/142

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 would-be network programmer http://slides.games-with-brains.net/143

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 would-be network programmer http://slides.games-with-brains.net/144

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 would-be network programmer http://slides.games-with-brains.net/145

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 would-be network programmer http://slides.games-with-brains.net/146

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 would-be network programmer http://slides.games-with-brains.net/147

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 would-be network programmer http://slides.games-with-brains.net/148

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 would-be network programmer http://slides.games-with-brains.net/149

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 would-be network programmer http://slides.games-with-brains.net/150

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 would-be network programmer http://slides.games-with-brains.net/151

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 would-be network programmer http://slides.games-with-brains.net/152

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 would-be network programmer http://slides.games-with-brains.net/153

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 would-be network programmer http://slides.games-with-brains.net/154

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 would-be network programmer http://slides.games-with-brains.net/155

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 would-be network programmer http://slides.games-with-brains.net/156

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 would-be network programmer http://slides.games-with-brains.net/157

http://golang.org/

go for the would-be network programmer http://slides.games-with-brains.net/158

twitter://#golang

go for the would-be network programmer http://slides.games-with-brains.net/159