2023-08-23 15:18:10 +09:00

57 lines
1.3 KiB
Go

package main
import (
"encoding/hex"
"net"
"time"
"github.com/c4ei/YunSeokYeol/app/protocol/common"
"github.com/pkg/errors"
)
func sendMessages(address string, messagesChan <-chan []byte) error {
connection, err := dialToNode(address)
if err != nil {
return err
}
for message := range messagesChan {
messageHex := make([]byte, hex.EncodedLen(len(message)))
hex.Encode(messageHex, message)
log.Infof("Sending message %s", messageHex)
err := sendMessage(connection, message)
if err != nil {
// if failed once, we might have been disconnected because of a previous message,
// so re-connect and retry before reporting error
connection, err = dialToNode(address)
if err != nil {
return err
}
err = sendMessage(connection, message)
if err != nil {
return err
}
}
}
return nil
}
func sendMessage(connection net.Conn, message []byte) error {
err := connection.SetDeadline(time.Now().Add(common.DefaultTimeout))
if err != nil {
return errors.Wrap(err, "Error setting connection deadline")
}
_, err = connection.Write(message)
return err
}
func dialToNode(address string) (net.Conn, error) {
connection, err := net.Dial("tcp", address)
if err != nil {
return nil, errors.Wrap(err, "Error connecting to node")
}
return connection, nil
}