mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-03-10 18:29:58 +00:00
chore: write dns reply in single syscall
This commit is contained in:
@@ -46,17 +46,24 @@ func RelayDnsConn(ctx context.Context, conn net.Conn, readTimeout time.Duration)
|
|||||||
ctx, cancel := context.WithTimeout(ctx, DefaultDnsRelayTimeout)
|
ctx, cancel := context.WithTimeout(ctx, DefaultDnsRelayTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
inData := buff[:n]
|
inData := buff[:n]
|
||||||
msg, err := relayDnsPacket(ctx, inData, buff, 0)
|
outBuff := buff[2:]
|
||||||
|
msg, err := relayDnsPacket(ctx, inData, outBuff, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = binary.Write(conn, binary.BigEndian, uint16(len(msg)))
|
if &msg[0] == &outBuff[0] { // msg is still in the buff
|
||||||
if err != nil {
|
binary.BigEndian.PutUint16(buff[:2], uint16(len(msg)))
|
||||||
return err
|
outBuff = buff[:2+len(msg)]
|
||||||
|
} else { // buff not big enough (WTF???)
|
||||||
|
newBuff := pool.Get(len(msg) + 2)
|
||||||
|
defer pool.Put(newBuff)
|
||||||
|
binary.BigEndian.PutUint16(newBuff[:2], uint16(len(msg)))
|
||||||
|
copy(newBuff[2:], msg)
|
||||||
|
outBuff = newBuff
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = conn.Write(msg)
|
_, err = conn.Write(outBuff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user