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 @@

-# 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 {