mirror of
https://github.com/sigcn/pg.git
synced 2025-10-27 10:10:55 +08:00
rdt: do not panic
This commit is contained in:
@@ -54,6 +54,7 @@ func (fm *FileManager) Open(index int) (*os.File, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fm *FileManager) HandleRequest(peerID string, conn net.Conn) {
|
func (fm *FileManager) HandleRequest(peerID string, conn net.Conn) {
|
||||||
|
defer conn.Close()
|
||||||
header := make([]byte, 4)
|
header := make([]byte, 4)
|
||||||
_, err := io.ReadFull(conn, header)
|
_, err := io.ReadFull(conn, header)
|
||||||
if err != nil || !bytes.Equal(header[:2], []byte{0, 0}) {
|
if err != nil || !bytes.Equal(header[:2], []byte{0, 0}) {
|
||||||
|
|||||||
13
rdt/rdt.go
13
rdt/rdt.go
@@ -253,6 +253,11 @@ func (c *rdtConn) buildFrame(cmd byte, no uint32, length uint16, data []byte) []
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *rdtConn) recv(pkt []byte) {
|
func (c *rdtConn) recv(pkt []byte) {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
slog.Debug("Recv", "recover", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
no := binary.BigEndian.Uint32(pkt[1:5])
|
no := binary.BigEndian.Uint32(pkt[1:5])
|
||||||
l := binary.BigEndian.Uint16(pkt[5:7])
|
l := binary.BigEndian.Uint16(pkt[5:7])
|
||||||
slog.Debug("RDTRecv", "cmd", pkt[0], "no", no, "peer", c.remoteAddr, "len", len(pkt))
|
slog.Debug("RDTRecv", "cmd", pkt[0], "no", no, "peer", c.remoteAddr, "len", len(pkt))
|
||||||
@@ -348,6 +353,11 @@ func (c *rdtConn) sendNCK(no uint32) {
|
|||||||
func (c *rdtConn) sendFIN() error {
|
func (c *rdtConn) sendFIN() error {
|
||||||
exit := make(chan struct{})
|
exit := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
slog.Debug("SendFIN", "recover", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
for range 5 {
|
for range 5 {
|
||||||
select {
|
select {
|
||||||
case <-exit:
|
case <-exit:
|
||||||
@@ -533,6 +543,9 @@ func (l *RDTListener) recvPacket(pkt []byte, addr net.Addr) {
|
|||||||
conn.recv(pkt)
|
conn.recv(pkt)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if pkt[0] != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
conn = l.newConn(addr)
|
conn = l.newConn(addr)
|
||||||
conn.server = true
|
conn.server = true
|
||||||
l.acceptConnMap[addr.String()] = conn
|
l.acceptConnMap[addr.String()] = conn
|
||||||
|
|||||||
Reference in New Issue
Block a user