Send 'vrack' in response to 'version'

This commit is contained in:
Ivan Kuznetsov 2017-10-01 10:08:51 +07:00
parent 1c5bc460f4
commit 7935589f8a
1 changed files with 52 additions and 16 deletions

View File

@ -22,6 +22,9 @@ type verzion struct {
AddrFrom string AddrFrom string
} }
type verack struct {
}
func commandToBytes(command string) []byte { func commandToBytes(command string) []byte {
var bytes [commandLength]byte var bytes [commandLength]byte
@ -48,30 +51,50 @@ func extractCommand(request []byte) []byte {
return request[:commandLength] return request[:commandLength]
} }
func sendVersion(addr string) { func sendData(addr string, data []byte) {
var payload bytes.Buffer
enc := gob.NewEncoder(&payload)
err := enc.Encode(verzion{nodeVersion, nodeAddress})
if err != nil {
log.Panic(err)
}
request := append(commandToBytes("version"), payload.Bytes()...)
conn, err := net.Dial(protocol, addr) conn, err := net.Dial(protocol, addr)
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }
defer conn.Close() defer conn.Close()
fmt.Printf("%x\n", request) fmt.Printf("%x\n", data)
_, err = io.Copy(conn, bytes.NewReader(request)) _, err = io.Copy(conn, bytes.NewReader(data))
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }
} }
func sendVersion(addr string) {
payload := gobEncode(verzion{nodeVersion, nodeAddress})
request := append(commandToBytes("version"), payload...)
sendData(addr, request)
}
func sendVrack(addr string) {
payload := gobEncode(verack{})
request := append(commandToBytes("verack"), payload...)
sendData(addr, request)
}
func handleVersion(request []byte) {
var buff bytes.Buffer
var payload verzion
buff.Write(request[commandLength:])
dec := gob.NewDecoder(&buff)
err := dec.Decode(&payload)
if err != nil {
log.Panic(err)
}
sendVrack(payload.AddrFrom)
}
func handleConnection(conn net.Conn) { func handleConnection(conn net.Conn) {
request, err := ioutil.ReadAll(conn) request, err := ioutil.ReadAll(conn)
if err != nil { if err != nil {
@ -81,9 +104,10 @@ func handleConnection(conn net.Conn) {
switch command { switch command {
case "version": case "version":
fmt.Printf("Received %s command", command) fmt.Printf("Received %s command\n", command)
// send verack handleVersion(request)
// send addr case "verack":
fmt.Printf("Received %s command\n", command)
default: default:
fmt.Println("Unknown command received!") fmt.Println("Unknown command received!")
} }
@ -112,3 +136,15 @@ func StartServer(nodeID int) {
go handleConnection(conn) go handleConnection(conn)
} }
} }
func gobEncode(data interface{}) []byte {
var buff bytes.Buffer
enc := gob.NewEncoder(&buff)
err := enc.Encode(data)
if err != nil {
log.Panic(err)
}
return buff.Bytes()
}