我正在实现一个客户端发送和接收 unixpackets 并与已经用 C++ 实现的服务器交互。
至此,客户端可以成功接收和向服务器发送数据包。但是我用了一个for循环,一直调用Recv看有没有新消息。
我实现了一个 Packet 类,以便客户端和服务器可以遵循相同的规则对消息进行编码和解码。Transport 是一个包装一个net.Conn
. Client由Transport、接收Packet和发送Packet组成。
我使用for 循环不断调用Recv以查看是否有新消息到达net.Conn
。
type Packet struct {
Length uint32
Data []byte
ReadOffset uint32
WriteOffset uint32
}
type Transport struct {
url string
conn net.Conn
}
// connect to url
func (transport *Transport) Dial(url string) error {
c, err := net.Dial("unixpacket", url)
if err != nil {
return err
}
transport.url = url
transport.conn = c
return nil
}
// sending Packet
func (transport *Transport) Send(p *Packet) bool {
readBuffer := (p.Data)[p.ReadOffset : p.WriteOffset]
_, err := transport.conn.Write(readBuffer)
if err != nil {
return false
}
return true
}
// receiving Packet
func (transport *Transport) Recv(p *Packet) bool {
writeBuffer := (p.Data)[p.WriteOffset :]
_, err := transport.conn.Read(writeBuffer)
if err != nil {
return false
}
return true
}
type Client struct {
Transport *Transport
RecvPacket *Packet
SendPacket *Packet
}
// keep checking transport
func (c *Client) ReadFromTransport() {
for {
time.Sleep(20 * time.Millisecond)
if c.Transport.Recv(c.RecvPacket) == false {
continue
}
}
}
问题
有没有一种方法可以net.Conn在新消息到达时通知 get 而不是使用 for 循环?
MMTTMM
一只斗牛犬
相关分类