gop2p/src/peers/peers.go

89 lines
1.6 KiB
Go
Raw Normal View History

2019-05-14 14:48:31 +00:00
package peers
import (
"net"
"os"
"fmt"
"strings"
"errfn"
)
type Peer struct {
address net.TCPAddr
listener net.TCPListener
connection net.TCPConn
}
func (p* Peer) SetAddr(port string) {
service := ":" + port
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
errfn.Check(err)
p.address = *tcpAddr
}
func (p* Peer) StartListening() {
listener, err := net.ListenTCP("tcp", &p.address)
errfn.Check(err)
p.listener = *listener
fmt.Printf("(%s) Waiting for peer connections...\n", os.Args[1])
for {
conn, err := p.listener.Accept()
if err != nil {
continue
}
handleConnection(conn)
}
}
func (p* Peer) Connect(remote Peer) {
peerconn, err := net.DialTCP("tcp4", nil, &remote.address)
errfn.Check(err)
fmt.Println("Found a remote peer")
p.connection = *peerconn
_, err = p.connection.Write([]byte("Hello from " + os.Args[1]))
errfn.Check(err)
var buf [512]byte
n, err := p.connection.Read(buf[0:])
errfn.Check(err)
result := string(buf[0:n])
fmt.Println(string(result))
}
func handleConnection(conn net.Conn) {
// close connection on exit
defer conn.Close()
var buf [512]byte
for {
// read up to 512 bytes
n, err := conn.Read(buf[0:])
if err != nil {
return
}
message := string(buf[0:n])
fmt.Println(message)
tokens := strings.Split(message, " ")
if tokens[0] != "" {
response := "Hi " + tokens[2] + ", from " + os.Args[1]
// write the n bytes read
_, err2 := conn.Write([]byte(response))
if err2 != nil {
return
}
}
}
}