diff --git a/README.MD b/README.MD
index 5933032b5..06202e302 100644
--- a/README.MD
+++ b/README.MD
@@ -1,5 +1,6 @@
# GoFrame
-
+
[](https://godoc.org/github.com/gogf/gf)
[](https://travis-ci.org/gogf/gf)
@@ -8,12 +9,15 @@
[](https://github.com/gogf/gf)
[](https://github.com/gogf/gf)
+
+
[](https://godoc.org/github.com/gogf/gf)
[](https://travis-ci.org/gogf/gf)
@@ -8,6 +9,8 @@
[](https://github.com/gogf/gf)
[](https://github.com/gogf/gf)
+
-
+# 赞助
+
+赞助支持`GF`框架的快速研发,如果您感兴趣,请联系 john@goframe.org 。
# 贡献者
diff --git a/g/net/gudp/gudp_conn.go b/g/net/gudp/gudp_conn.go
index 975ef8c37..0d924734f 100644
--- a/g/net/gudp/gudp_conn.go
+++ b/g/net/gudp/gudp_conn.go
@@ -24,7 +24,7 @@ type Conn struct {
const (
gDEFAULT_RETRY_INTERVAL = 100 // (毫秒)默认重试时间间隔
- gDEFAULT_READ_BUFFER_SIZE = 1024 // 默认数据读取缓冲区大小
+ gDEFAULT_READ_BUFFER_SIZE = 64 // (KB)默认数据读取缓冲区大小
gRECV_ALL_WAIT_TIMEOUT = time.Millisecond // 读取全部缓冲数据时,没有缓冲数据时的等待间隔
)
@@ -88,7 +88,8 @@ func (c *Conn) Send(data []byte, retry...Retry) error {
}
}
-// 接收数据
+// 接收数据.
+// 注意:UDP协议存在消息边界,因此使用 length<=0 可以获取缓冲区所有消息包数据,即一个完整包。
func (c *Conn) Recv(length int, retry...Retry) ([]byte, error) {
var err error // 读取错误
var size int // 读取长度
diff --git a/g/net/gudp/gudp_conn_pkg.go b/g/net/gudp/gudp_conn_pkg.go
deleted file mode 100644
index 4b65be743..000000000
--- a/g/net/gudp/gudp_conn_pkg.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
-//
-// This Source Code Form is subject to the terms of the MIT License.
-// If a copy of the MIT was not distributed with this file,
-// You can obtain one at https://github.com/gogf/gf.
-
-package gudp
-
-import (
- "encoding/binary"
- "errors"
- "fmt"
- "time"
-)
-
-const (
- // 允许最大的简单协议包大小(byte), 15MB
- PKG_MAX_SIZE = 0xFFFFFF
- // 消息包头大小: "总长度"3字节+"校验码"4字节
- PKG_HEADER_SIZE = 7
-)
-
-// 根据简单协议发送数据包。
-// 简单协议数据格式:总长度(24bit)|校验码(32bit)|数据(变长)。
-// 注意:
-// 1. "总长度"包含自身3字节及"校验码"4字节。
-// 2. 由于"总长度"为3字节,并且使用的BigEndian字节序,因此最后返回的buffer使用了buffer[1:]。
-func (c *Conn) SendPkg(data []byte, retry...Retry) error {
- length := uint32(len(data))
- if length > PKG_MAX_SIZE - PKG_HEADER_SIZE {
- return errors.New(fmt.Sprintf(`data size %d exceeds max pkg size %d`, length, PKG_MAX_SIZE - PKG_HEADER_SIZE))
- }
- buffer := make([]byte, PKG_HEADER_SIZE + 1 + len(data))
- copy(buffer[PKG_HEADER_SIZE + 1 : ], data)
- binary.BigEndian.PutUint32(buffer[0 : ], PKG_HEADER_SIZE + length)
- binary.BigEndian.PutUint32(buffer[4 : ], Checksum(data))
- //fmt.Println("SendPkg:", buffer[1:])
- return c.Send(buffer[1:], retry...)
-}
-
-// 简单协议: 带超时时间的数据发送
-func (c *Conn) SendPkgWithTimeout(data []byte, timeout time.Duration, retry...Retry) error {
- c.SetSendDeadline(time.Now().Add(timeout))
- defer c.SetSendDeadline(time.Time{})
- return c.SendPkg(data, retry...)
-}
-
-// 简单协议: 发送数据并等待接收返回数据
-func (c *Conn) SendRecvPkg(data []byte, retry...Retry) ([]byte, error) {
- if err := c.SendPkg(data, retry...); err == nil {
- return c.RecvPkg(retry...)
- } else {
- return nil, err
- }
-}
-
-// 简单协议: 发送数据并等待接收返回数据(带返回超时等待时间)
-func (c *Conn) SendRecvPkgWithTimeout(data []byte, timeout time.Duration, retry...Retry) ([]byte, error) {
- if err := c.SendPkg(data, retry...); err == nil {
- return c.RecvPkgWithTimeout(timeout, retry...)
- } else {
- return nil, err
- }
-}
-
-// 简单协议: 获取一个数据包。
-func (c *Conn) RecvPkg(retry...Retry) (result []byte, err error) {
- var temp []byte
- var length uint32
- for {
- // 先根据对象的缓冲区数据进行计算
- for {
- if len(c.buffer) >= PKG_HEADER_SIZE {
- // 注意"总长度"为3个字节,不满足4个字节的uint32类型,因此这里"低位"补0
- length = binary.BigEndian.Uint32([]byte{0, c.buffer[0], c.buffer[1], c.buffer[2]})
- // 解析的大小是否符合规范
- if length == 0 || length + PKG_HEADER_SIZE > PKG_MAX_SIZE {
- c.buffer = c.buffer[1:]
- continue
- }
- // 不满足包大小,需要继续读取
- if uint32(len(c.buffer)) < length {
- break
- }
- // 数据校验
- if binary.BigEndian.Uint32(c.buffer[3 : PKG_HEADER_SIZE]) != Checksum(c.buffer[PKG_HEADER_SIZE : length]) {
- c.buffer = c.buffer[1:]
- continue
- }
- result = c.buffer[PKG_HEADER_SIZE : length]
- c.buffer = c.buffer[length: ]
- return
- } else {
- break
- }
- }
- // 读取系统socket缓冲区的完整数据
- temp, err = c.Recv(-1, retry...)
- if err != nil {
- break
- }
- if len(temp) > 0 {
- c.buffer = append(c.buffer, temp...)
- }
- //fmt.Println("RecvPkg:", c.buffer)
- }
- return
-}
-
-// 简单协议: 带超时时间的消息包获取
-func (c *Conn) RecvPkgWithTimeout(timeout time.Duration, retry...Retry) ([]byte, error) {
- c.SetRecvDeadline(time.Now().Add(timeout))
- defer c.SetRecvDeadline(time.Time{})
- return c.RecvPkg(retry...)
-}
\ No newline at end of file
diff --git a/g/net/gudp/gudp_func_pkg.go b/g/net/gudp/gudp_func_pkg.go
deleted file mode 100644
index f0796064a..000000000
--- a/g/net/gudp/gudp_func_pkg.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
-//
-// This Source Code Form is subject to the terms of the MIT License.
-// If a copy of the MIT was not distributed with this file,
-// You can obtain one at https://github.com/gogf/gf.
-
-package gudp
-
-import "time"
-
-// 简单协议: (面向短链接)发送消息包
-func SendPkg(addr string, data []byte, retry...Retry) error {
- conn, err := NewConn(addr)
- if err != nil {
- return err
- }
- defer conn.Close()
- return conn.SendPkg(data, retry...)
-}
-
-// 简单协议: (面向短链接)发送数据并等待接收返回数据
-func SendRecvPkg(addr string, data []byte, retry...Retry) ([]byte, error) {
- conn, err := NewConn(addr)
- if err != nil {
- return nil, err
- }
- defer conn.Close()
- return conn.SendRecvPkg(data, retry...)
-}
-
-// 简单协议: (面向短链接)带超时时间的数据发送
-func SendPkgWithTimeout(addr string, data []byte, timeout time.Duration, retry...Retry) error {
- conn, err := NewConn(addr)
- if err != nil {
- return err
- }
- defer conn.Close()
- return conn.SendPkgWithTimeout(data, timeout, retry...)
-}
-
-// 简单协议: (面向短链接)发送数据并等待接收返回数据(带返回超时等待时间)
-func SendRecvPkgWithTimeout(addr string, data []byte, timeout time.Duration, retry...Retry) ([]byte, error) {
- conn, err := NewConn(addr)
- if err != nil {
- return nil, err
- }
- defer conn.Close()
- return conn.SendRecvPkgWithTimeout(data, timeout, retry...)
-}
\ No newline at end of file
diff --git a/g/os/gfile/gfile.go b/g/os/gfile/gfile.go
index 1a97a51dc..47bbdb680 100644
--- a/g/os/gfile/gfile.go
+++ b/g/os/gfile/gfile.go
@@ -5,8 +5,6 @@
// You can obtain one at https://github.com/gogf/gf.
// Package gfile provides easy-to-use operations for file system.
-//
-// 文件管理.
package gfile
import (
@@ -15,6 +13,7 @@ import (
"fmt"
"github.com/gogf/gf/g/container/gtype"
"github.com/gogf/gf/g/text/gregex"
+ "github.com/gogf/gf/g/text/gstr"
"github.com/gogf/gf/g/util/gconv"
"io"
"os"
@@ -452,11 +451,24 @@ func MainPkgPath() string {
}
for i := 1; i < 10000; i++ {
if _, file, _, ok := runtime.Caller(i); ok {
- if gregex.IsMatchString(`package\s+main`, GetContents(file)) {
- path = Dir(file)
- mainPkgPath.Set(path)
- return path
+ if gstr.Contains(file, "/gf/g/") {
+ continue
}
+ if Ext(file) != ".go" {
+ continue
+ }
+ path = file
+ for path != "/" && gstr.Contains(path, "/") {
+ files, _ := ScanDir(path, "*.go")
+ for _, v := range files {
+ if gregex.IsMatchString(`package\s+main`, GetContents(v)) {
+ mainPkgPath.Set(path)
+ return path
+ }
+ }
+ path = Dir(path)
+ }
+
} else {
break
}
diff --git a/g/os/gfile/gfile_test.go b/g/os/gfile/gfile_test.go
index b7b9317b8..c0315f9f5 100644
--- a/g/os/gfile/gfile_test.go
+++ b/g/os/gfile/gfile_test.go
@@ -653,8 +653,8 @@ func TestMkdir(t *testing.T) {
func TestStat(t *testing.T) {
gtest.Case(t, func() {
var (
- tpath1 string = "/testfile_t1.txt"
- tpath2 string = "./testfile_t1_no.txt"
+ tpath1 = "/testfile_t1.txt"
+ tpath2 = "./testfile_t1_no.txt"
err error
fileiofo os.FileInfo
)
@@ -675,12 +675,7 @@ func TestStat(t *testing.T) {
func TestMainPkgPath(t *testing.T) {
gtest.Case(t, func() {
- var (
- reads string
- )
-
- reads = gfile.MainPkgPath()
+ reads := gfile.MainPkgPath()
gtest.Assert(reads, "")
-
})
}
diff --git a/geg/other/test.go b/geg/other/test.go
index 03407626f..47632c222 100644
--- a/geg/other/test.go
+++ b/geg/other/test.go
@@ -3,10 +3,16 @@ package main
import (
"fmt"
"github.com/gogf/gf/g"
+ "github.com/gogf/gf/g/os/gfile"
"github.com/gogf/gf/g/util/gconv"
)
func main() {
+ fmt.Println(gfile.Dir("/"))
+ return
+ a := []int{1,2,3}
+ fmt.Println(a[:0])
+ return
type Person struct{
Name string
}