1 Star 0 Fork 0

sososu/goUtils

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
net.go 1.71 KB
一键复制 编辑 原始数据 按行查看 历史
kim.su 提交于 2022-02-16 18:52 +08:00 . add timeoutconn func
/*
* @Author: soso
* @Date: 2022-01-27 17:52:43
* @LastEditTime: 2022-02-16 15:30:36
* @LastEditors: Please set LastEditors
* @Description: 发包,收包
* @FilePath: /sync-client/go-utils/utils/sonet/net.go
*/
package sonet
import (
"fmt"
"io"
"net"
"os"
"time"
)
// 发送数据包
func SendPack(conn net.Conn, msgId uint32, data []byte) (err error) {
dp := NewDataPack()
msg := &Message{
Id: msgId,
DataLen: uint32(len(data)),
Data: data,
}
sendData, err := dp.Pack(msg)
if err != nil {
return
}
retry := 0
RETRY:
conn.SetWriteDeadline(time.Now().Add(time.Second * timeout))
if err != nil {
return err
}
_, err = conn.Write(sendData)
if err != nil && os.IsTimeout(err) {
retry += 1
if retry <= RetryTimes {
goto RETRY
}
}
return
}
// 接收数据包
func ReceivePack(conn net.Conn) (data *Message, err error) {
dp := NewDataPack()
headData := make([]byte, dp.GetHeadLen())
_, err = io.ReadFull(conn, headData)
if err != nil {
return
}
msgHead, err := dp.Unpack(headData)
if err != nil {
return nil, err
}
if msgHead.GetDataLen() > 0 {
msg := msgHead.(*Message)
msg.Data = make([]byte, msg.GetDataLen())
retry := 0
RETRY:
conn.SetWriteDeadline(time.Now().Add(time.Second * timeout))
if err != nil {
return nil, err
}
_, err = io.ReadFull(conn, msg.Data)
if err != nil && os.IsTimeout(err) {
retry += 1
if retry <= RetryTimes {
goto RETRY
}
}
if err != nil {
return nil, err
}
return msg, nil
}
return msgHead.(*Message), nil
}
// 带超时的连接
func TimeoutConn(ip string, port int) (conn net.Conn, err error) {
dialer := net.Dialer{Timeout: time.Second * timeout}
return dialer.Dial("tcp", fmt.Sprintf("%s:%d", ip, port))
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kimsoso/go-utils.git
git@gitee.com:kimsoso/go-utils.git
kimsoso
go-utils
goUtils
d9d0c300a4b2

搜索帮助