Adding example files from ch3
parent
91831262c6
commit
af09d4e09c
@ -0,0 +1,66 @@
|
|||||||
|
package ch3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDial(t *testing.T) {
|
||||||
|
//create a listener on a random port to make out test connection to
|
||||||
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// channel that receives struct objects
|
||||||
|
done := make(chan struct{})
|
||||||
|
|
||||||
|
// Goroutine (aka handler) for listening for connections
|
||||||
|
go func() {
|
||||||
|
defer func() { done <- struct{}{} }()
|
||||||
|
|
||||||
|
for {
|
||||||
|
conn, err := listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// goroutine for responding to connection requests
|
||||||
|
go func(c net.Conn) {
|
||||||
|
defer func() {
|
||||||
|
c.Close()
|
||||||
|
done <- struct{}{}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// create a slice of size 1024 (1 kilobyte)
|
||||||
|
buf := make([]byte, 1024)
|
||||||
|
for {
|
||||||
|
// reads up to 1024 bytes at a time from the socket
|
||||||
|
n, err := c.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
// c.Read returns io.EOF when FIN packet (graceful termination) is received
|
||||||
|
if err != io.EOF {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// logs the bytes it receives
|
||||||
|
t.Logf("received: %q", buf[:n])
|
||||||
|
}
|
||||||
|
}(conn)
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Now we make our client
|
||||||
|
conn, err := net.Dial("tcp", listener.Addr().String())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.Close()
|
||||||
|
<-done
|
||||||
|
listener.Close()
|
||||||
|
<-done
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package ch3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestListener(t *testing.T) {
|
||||||
|
listener, err := net.Listen("tcp", "0.0.0.0:0")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() { _ = listener.Close() }()
|
||||||
|
|
||||||
|
t.Logf("bound to port %q", listener.Addr())
|
||||||
|
|
||||||
|
// example for handling connections and processing connections in a goroutine
|
||||||
|
// for {
|
||||||
|
// conn, err := listener.Accept()
|
||||||
|
// if err != nil {
|
||||||
|
// t.Fatal(err)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// go func(c net.Conn) {
|
||||||
|
// defer c.Close()
|
||||||
|
// // Your code goes here to handle the connection
|
||||||
|
// }(conn)
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue