diff --git a/build.sh b/build.sh index c994b98..5059486 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #/bash/sh -export VERSION=0.25.3 +export VERSION=0.25.4 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go @@ -175,5 +175,5 @@ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin export DOCKER_CLI_EXPERIMENTAL=enabled docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d docker buildx create --use --name mybuilder -docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . -docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +docker buildx build --tag ffdfgdfg/nps:$VERSION --tag ffdfgdfg/nps:latest --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +docker buildx build --tag ffdfgdfg/npc:$VERSION --tag ffdfgdfg/npc:latest --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . diff --git a/docs/_coverpage.md b/docs/_coverpage.md index cb361da..68e0cc3 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,6 +1,6 @@ ![logo](logo.svg) -# NPS 0.25.2 +# NPS 0.25.4 > 一款轻量级、高性能、功能强大的内网穿透代理服务器 diff --git a/docs/nps_use.md b/docs/nps_use.md index 4058869..2681e8b 100644 --- a/docs/nps_use.md +++ b/docs/nps_use.md @@ -40,4 +40,6 @@ nps-update.exe update ``` -更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 \ No newline at end of file +更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 + +如果无法更新成功,可以直接自行下载releases压缩包然后覆盖原有的nps二进制文件和web目录 diff --git a/docs/use.md b/docs/use.md index 00547b2..5f775ab 100644 --- a/docs/use.md +++ b/docs/use.md @@ -36,6 +36,8 @@ npc-update.exe update 更新完成后,执行执行`sudo npc start`或者`npc.exe start`重新运行即可完成升级 +如果无法更新成功,可以直接自行下载releases压缩包然后覆盖原有的npc二进制文件 + ## 配置文件模式 此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 ``` diff --git a/gui/npc/AndroidManifest.xml b/gui/npc/AndroidManifest.xml index 463634d..901a508 100755 --- a/gui/npc/AndroidManifest.xml +++ b/gui/npc/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index cf4b988..c6956f5 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -246,6 +246,15 @@ func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) { return } +func (Self *MuxPackager) reset() { + Self.Id = 0 + Self.Flag = 0 + Self.Length = 0 + Self.Content = nil + Self.ReadLength = 0 + Self.Window = 0 +} + const ( ipV4 = 1 domainName = 3 diff --git a/lib/common/pool.go b/lib/common/pool.go index 3ed19dc..31931f9 100644 --- a/lib/common/pool.go +++ b/lib/common/pool.go @@ -93,18 +93,20 @@ type windowBufferPool struct { func (Self *windowBufferPool) New() { Self.pool = sync.Pool{ New: func() interface{} { - return make([]byte, PoolSizeWindow, PoolSizeWindow) + return make([]byte, PoolSizeWindow) }, } } func (Self *windowBufferPool) Get() (buf []byte) { buf = Self.pool.Get().([]byte) - return buf[:PoolSizeWindow] + buf = buf[:PoolSizeWindow] + return buf } func (Self *windowBufferPool) Put(x []byte) { - Self.pool.Put(x[:PoolSizeWindow]) // make buf to full + x = x[:0] // clean buf + Self.pool.Put(x) } type bufferPool struct { @@ -146,6 +148,7 @@ func (Self *muxPackagerPool) Get() *MuxPackager { } func (Self *muxPackagerPool) Put(pack *MuxPackager) { + pack.reset() Self.pool.Put(pack) } diff --git a/lib/install/install.go b/lib/install/install.go index 66bb28b..6156e3f 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -91,11 +91,13 @@ func copyStaticFile(srcPath, bin string) string { if _, err := copyFile(filepath.Join(srcPath, bin), "/usr/local/bin/"+bin); err != nil { log.Fatalln(err) } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/"+bin+"-update") + copyFile(filepath.Join(srcPath, bin), "/usr/local/bin/"+bin+"-update") + chMod("/usr/local/bin/"+bin+"-update", 0755) binPath = "/usr/local/bin/" + bin } } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/"+bin+"-update") + copyFile(filepath.Join(srcPath, bin), "/usr/bin/"+bin+"-update") + chMod("/usr/bin/"+bin+"-update", 0755) binPath = "/usr/bin/" + bin } } else { diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 28ec1de..52fb642 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -2,6 +2,7 @@ package mux import ( "errors" + "github.com/astaxie/beego/logs" "io" "math" "net" @@ -215,10 +216,10 @@ func (Self *ReceiveWindow) calcSize() { if n < common.MAXIMUM_SEGMENT_SIZE*10 { n = common.MAXIMUM_SEGMENT_SIZE * 10 } - bufLen := Self.bufQueue.Len() - if n < bufLen { - n = bufLen - } + //bufLen := Self.bufQueue.Len() + //if n < bufLen { + // n = bufLen + //} if n < Self.maxSize/2 { n = Self.maxSize / 2 } @@ -227,6 +228,7 @@ func (Self *ReceiveWindow) calcSize() { n = 2 * Self.maxSize } if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { + logs.Warn("window too large", n) n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) } // set the maximum size @@ -444,7 +446,20 @@ func (Self *SendWindow) allow() { } func (Self *SendWindow) sent(sentSize uint32) { - atomic.AddUint64(&Self.remainingWait, ^(uint64(sentSize)<= sentSize { + atomic.AddUint64(&Self.remainingWait, ^(uint64(sentSize)<= common.MAXIMUM_SEGMENT_SIZE*300 { + if Self.bufLength >= Self.calcThreshold { Self.lastReadStart, Self.readStart = Self.readStart, time.Now() Self.calcBandWidth() } @@ -410,7 +442,21 @@ func (Self *bandwidth) SetCopySize(n uint16) { func (Self *bandwidth) calcBandWidth() { t := Self.readStart.Sub(Self.lastReadStart) - atomic.StoreUint64(&Self.readBandwidth, math.Float64bits(float64(Self.bufLength)/t.Seconds())) + bufferSize, err := syscall.GetsockoptInt(int(Self.fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + //logs.Warn(bufferSize) + if err != nil { + logs.Warn(err) + Self.bufLength = 0 + return + } + if Self.bufLength >= uint32(bufferSize) { + atomic.StoreUint64(&Self.readBandwidth, math.Float64bits(float64(Self.bufLength)/t.Seconds())) + // calculate the hole socket buffer, the time meaning to fill the buffer + //logs.Warn(Self.Get()) + } else { + Self.calcThreshold = uint32(bufferSize) + } + // socket buffer size is bigger than bufLength, so we don't calculate it Self.bufLength = 0 } diff --git a/lib/version/version.go b/lib/version/version.go index 78dbbef..c2f1489 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,6 +1,6 @@ package version -const VERSION = "0.25.3" +const VERSION = "0.25.4" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string {