mirror of
https://github.com/wlynxg/NetHive.git
synced 2025-12-24 13:08:30 +08:00
fix: 修复 buffer 拷贝相关问题
This commit is contained in:
@@ -182,6 +182,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
|
||||
// set the current file descriptor to non-blocking status to improve concurrency
|
||||
err = unix.SetNonblock(tfd, true)
|
||||
if err != nil {
|
||||
syscall.Close(tfd)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package engine
|
||||
|
||||
import "io"
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
var _ io.ReadWriteCloser = (*devWrapper)(nil)
|
||||
|
||||
@@ -12,7 +14,7 @@ type devWrapper struct {
|
||||
func (c *devWrapper) Read(p []byte) (n int, err error) {
|
||||
packet := <-c.r
|
||||
copy(p, packet.Data)
|
||||
return len(p), nil
|
||||
return len(packet.Data), nil
|
||||
}
|
||||
|
||||
func (c *devWrapper) Write(p []byte) (n int, err error) {
|
||||
|
||||
@@ -158,17 +158,23 @@ func (e *Engine) Start() error {
|
||||
|
||||
util.Advertise(e.ctx, e.discovery, e.host.ID().String())
|
||||
go func() {
|
||||
ticker := time.NewTimer(5 * time.Minute)
|
||||
for {
|
||||
peers, err := e.dht.GetClosestPeers(e.ctx, string(e.host.ID()))
|
||||
if err != nil {
|
||||
e.log.Warningf(e.ctx, "Failed to get nearest node: %s", err)
|
||||
continue
|
||||
}
|
||||
select {
|
||||
case <-ticker.C:
|
||||
peers, err := e.dht.GetClosestPeers(e.ctx, string(e.host.ID()))
|
||||
if err != nil {
|
||||
e.log.Warningf(e.ctx, "Failed to get nearest node: %s", err)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, id := range peers {
|
||||
e.relayChan <- e.host.Peerstore().PeerInfo(id)
|
||||
for _, id := range peers {
|
||||
e.relayChan <- e.host.Peerstore().PeerInfo(id)
|
||||
}
|
||||
case <-e.ctx.Done():
|
||||
ticker.Stop()
|
||||
return
|
||||
}
|
||||
time.Sleep(10 * time.Minute)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -204,8 +210,9 @@ func (e *Engine) RoutineTUNReader() {
|
||||
continue
|
||||
}
|
||||
payload := Payload{
|
||||
Src: ip.Src(),
|
||||
Dst: ip.Dst(),
|
||||
Src: ip.Src(),
|
||||
Dst: ip.Dst(),
|
||||
Data: make([]byte, n),
|
||||
}
|
||||
copy(payload.Data, buff[:n])
|
||||
select {
|
||||
@@ -225,7 +232,7 @@ func (e *Engine) RoutineTUNWriter() {
|
||||
for payload = range e.devWriter {
|
||||
_, err = e.device.Write(payload.Data)
|
||||
if err != nil {
|
||||
e.errChan <- fmt.Errorf("[RoutineTUNWriter]: %s", err)
|
||||
e.log.Error(e.ctx, fmt.Errorf("[RoutineTUNWriter]: %s", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -237,7 +244,6 @@ func (e *Engine) RoutineRouteTableWriter() {
|
||||
)
|
||||
|
||||
for payload = range e.devReader {
|
||||
fmt.Println(payload.Dst)
|
||||
var conn PacketChan
|
||||
c, ok := e.routeTable.addr.Load(payload.Dst)
|
||||
if ok {
|
||||
@@ -310,6 +316,7 @@ func (e *Engine) addConn(dst netip.Addr) (PacketChan, error) {
|
||||
e.log.Warningf(e.ctx, "Connection establishment with node %s failed due to %s", info, err)
|
||||
}
|
||||
e.log.Infof(e.ctx, "Peer [%s] connect success", string(id))
|
||||
defer stream.Close()
|
||||
|
||||
go func() {
|
||||
defer stream.Close()
|
||||
@@ -319,7 +326,6 @@ func (e *Engine) addConn(dst netip.Addr) (PacketChan, error) {
|
||||
}
|
||||
}()
|
||||
|
||||
defer stream.Close()
|
||||
_, err = io.Copy(dev, stream)
|
||||
if err != nil && err != io.EOF {
|
||||
e.log.Errorf(e.ctx, "Peer [%s] stream read error: %s", string(id), err)
|
||||
|
||||
Reference in New Issue
Block a user