UDPClient.go
package ipc
import (
"bytes"
"encoding/gob"
"log"
"net"
"time"
)
type UDPClient struct {
UDPBase
conn *net.UDPConn
addr *net.UDPAddr
}
func NewUDPClient(addr string, port int) *UDPClient {
client := &UDPClient{
UDPBase: UDPBase{
addr: addr,
port: port,
mtu: 32000,
timeout: 100 * time.Millisecond,
},
}
client.create(addr, port)
return client
}
func (u *UDPClient) create(addr string, port int) {
u.addr, _ = net.ResolveUDPAddr("udp", net.JoinHostPort(addr, string(port)))
u.conn, _ = net.DialUDP("udp", nil, u.addr)
u.conn.SetReadDeadline(time.Now().Add(u.timeout))
}
func (u *UDPClient) reconnect() {
if u.conn != nil {
log.Println("Reconnecting UDP client..")
u.conn.Close()
u.create(u.addr.IP.String(), u.addr.Port)
time.Sleep(u.timeout)
}
}
func (u *UDPClient) send(command string, data []byte, retry int, sleep time.Duration) ([]byte, error) {
_, err := u.conn.Write(data)
if err != nil {
return nil, err
}
buffer := make([]byte, u.mtu)
for i := 0; i < retry; i++ {
u.conn.SetReadDeadline(time.Now().Add(u.timeout))
n, _, err := u.conn.ReadFromUDP(buffer)
if err == nil && buffer[0] == command[0] {
return buffer[1:n], nil
}
time.Sleep(sleep)
}
return nil, err
}
func (u *UDPClient) Once(command string, data interface{}) (interface{}, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(data)
if err != nil {
return nil, err
}
serialized := append([]byte(command), buf.Bytes()...)
result, err := u.send(command, serialized, 3, 100*time.Microsecond)
if err != nil {
return nil, err
}
var res interface{}
dec := gob.NewDecoder(bytes.NewReader(result))
err = dec.Decode(&res)
return res, err
}
func (u *UDPClient) Rewind(command string, data interface{}) (interface{}, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(data)
if err != nil {
return nil, err
}
serialized := append([]byte(command), buf.Bytes()...)
var result []byte
var res interface{}
for {
result, err = u.send(command, serialized, 20, 100*time.Microsecond)
if err == nil {
break
}
u.reconnect()
time.Sleep(u.timeout * 2)
}
dec := gob.NewDecoder(bytes.NewReader(result))
err = dec.Decode(&res)
return res, err
}๊ฐ์
UDPClient ๊ตฌ์กฐ์ฒด
UDPClient ๊ตฌ์กฐ์ฒดNewUDPClient ํจ์
NewUDPClient ํจ์create ๋ฉ์๋
create ๋ฉ์๋reconnect ๋ฉ์๋
reconnect ๋ฉ์๋send ๋ฉ์๋
send ๋ฉ์๋Once ๋ฉ์๋
Once ๋ฉ์๋Rewind ๋ฉ์๋
Rewind ๋ฉ์๋์์ฝ
Last updated