当前位置: 代码网 > it编程>前端脚本>Golang > GoLang socket网络编程传输数据包时进行长度校验的方法

GoLang socket网络编程传输数据包时进行长度校验的方法

2024年11月25日 Golang 我要评论
正常来说,我们发送和接收数据时,是像下面这样的:// 发送端func main() {conn, _ := net.dial("tcp", "127.0.0.1:8889")data := []byt

正常来说,我们发送和接收数据时,是像下面这样的:

// 发送端
func main() {
	conn, _ := net.dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	conn.write(data)
	fmt.println("成功发送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.accept()
	data := make([]byte, 1024)
	conn.read(data)
	fmt.println("成功接收: ", string(data))
}

运行结果如下:

这样看似没问题,但实际上还是存在着一定的风险(如数据丢失、解析错误…),这时就需要在发送和接受时对数据进行校验来确保交互的稳定性和安全性。

我们通常利用传输数据的长度来进行校验,思路如下:发送端先发送数据长度len1,再发送数据本体。接收端先接收到数据长度len1,再接收到数据本体,然后将数据本体的程度与数据长度len1进行比较,若二者相等则确认数据传输成功。

上代码

// 发送端
func main() {
	conn, _ := net.dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	// 发送data的长度len1
	len1 := make([]byte, len(data))
	datalen := uint32(len(data))
	binary.bigendian.putuint32(len1[:4], datalen)
	conn.write(len1[:4])
	// 发送data本体
	conn.write(data)
	fmt.println("成功发送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.accept()
	// 接收到 data 的长度
	len1:= make([]byte, 1024)
	reallen, _ := conn.read(len1[:4])
	datalen := binary.bigendian.uint32(len1[:4])// 将 data 的长度由 []byte 转为 uint32
	// 接收到 data
	data := make([]byte, 1024)
	reallen, _ = conn.read(data[:datalen])
	// 在这里进行校验
	if reallen != int(datalen) {
		fmt.println("数据在传输时出现问题")
		return
	}
	fmt.println("成功接收: ", string(data))
}

这样,我们就在接收端初步实现了数据的校验。

众所周知,read()函数和write()函数都可以实际传输了多少长度(字节),所以我们可以根据这个来完善一下数据的校验。

思路:在每次传输数据(read或write)时,我们根据返回的传输长度进行判断。

例如:

reallen, _ := conn.write(buf[:4])
	if reallen != 4 {
		fmt.println("数据在传输时出现问题")
		return
	}
reallen, _ = conn.write(data)
	if reallen != int(datalen) {
		fmt.println("数据在传输时出现问题")
		return
	}

在我们之前的代码中完善这个校验:

// 发送端
func main() {
	conn, _ := net.dial("tcp", "127.0.0.1:8889")
	data := []byte("hello world")
	// 发送data的长度len1
	len1 := make([]byte, len(data))
	datalen := uint32(len(data))
	binary.bigendian.putuint32(len1[:4], datalen)
	conn.write(len1[:4])
	// 完善校验
	if reallen != 4 {
		fmt.println("数据在传输时出现问题")
		return
	}
	// 发送data本体
	conn.write(data)
	// 完善校验
	if reallen != int(datalen) {
		fmt.println("数据在传输时出现问题")
		return
	}
	fmt.println("成功发送: ", string(data))
}
// 接收端
func main() {
	listen, _ := net.listen("tcp", "0.0.0.0:8889")
	conn, _ := listen.accept()
	// 接收到 data 的长度
	len1:= make([]byte, 1024)
	reallen, _ := conn.read(len1[:4])
	datalen := binary.bigendian.uint32(len1[:4])// 将 data 的长度由 []byte 转为 uint32
	// 完善校验
	if reallen != 4 {
		fmt.println("数据在传输时出现问题")
		return
	}
	// 接收到 data
	data := make([]byte, 1024)
	reallen, _ = conn.read(data[:datalen])
	// 完善校验
		if reallen != int(datalen) {
		fmt.println("数据在传输时出现问题")
		return
	}
	// 在这里进行校验
	if reallen != int(datalen) {
		fmt.println("数据在传输时出现问题")
		return
	}
	fmt.println("成功接收: ", string(data))
}

这样,就实现了对数据的长度的校验。

到此这篇关于golang socket网络编程传输数据包时如何进行长度校验的文章就介绍到这了,更多相关golang socket长度校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com