代码拉取完成,页面将自动刷新
/*
* @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))
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。