Golang UDP IPV6 编程

文章详细介绍了网络通信的基本步骤,包括服务端的socket、bind、listen、accept操作,以及客户端的socket和connect(UDP不需要connect)。接着分别阐述了TCP和UDP的通信过程。在Golang中实现IPv6UDP通信的代码示例给出,包括客户端和服务器端的功能函数,展示了如何创建UDP连接、发送和接收数据。此外,还提供了使用nc工具进行本地测试的方法。
摘要由CSDN通过智能技术生成

一、网络通信的步骤

服务端

1.socket()  
 创建通信的套接字socket:ip:addr
2.bind() 
 将套接字绑定监听的地址和端口号,作用是:服务器一般有很多网卡,多个IP地址,bind指定具体监听  哪一个IP地址及对应的端口号(若服务器有3个网卡,192.168.66.1,192.168.66.2,192.168.66.3,bind绑定的是192.168.66.3,那当且仅当客户端请求发送给192.168.66.3时才能被监听到,并进行请求的处理)。
**全0的IP地址表示监听所有网卡的请求,无论请求的是哪一个IP都能连接上**
**0端口是一种由系统指定动态生成的端口。也即是说,监听端口0,系统会自动重新分配一个系统空闲的端口**
3.listen()
 使用上面创建的套接字循环监听bind上IP到来的请求(两个队列)
4.accept() 
 请求到来时,accpet复制该套接字的请求进行处理。

客户端

1.socket() 
 创建套接字
2.connect() (可选)
 使用上面的套接字连接服务端IP和port,进行通信
**UDP通信不需要客户端建立连接,因此不需要connect**

二、TCP通信步骤

三、UDP通信步骤和示例

在这里插入图片描述

四、golang UDP IPV6通信代码及测试

参考博客
https://blog.csdn.net/weixin_45477086/article/details/122901328

以下测试均为全局单播地址,本地链路地址的UDP通信还需测试(是否需要zone)

1.客户端

代码

// 客户端向服务端:端口发送数据
func UDPIPV6Client(IP string, p ort int) {

   //1.创建要访问的服务端地址
	serverAddr := &net.UDPAddr{IP: net.ParseIP(IP), Port: port}
	
	//2.创建和服务器的连接
	conn, err := net.DialUDP("udp", nil, serverAddr)
	if err != nil {
		fmt.Println("net.DialUDP failed,err:", err.Error())
		return
	}
	defer conn.Close()
	
	//3.发送数据
	conn.Write([]byte("hello"))
	fmt.Println("conn.Write data:hello")
	
	//4.接收数据
	buf := make([]byte, 1024)
	conn.Read(buf)
	fmt.Println("conn read data:", buf)

}

测试:本地模拟服务端测试客户端代码

工具:nc(netCat)(centos安装nc:yum install nc -y)
测试方法:
(1)centos模拟本地服务器:centos终端输入 nc -6lup 666
(2) 运行客户端代码

2.服务端

代码

//服务端向客户端:端口发送并读取数据
func UDPIPV6Server(ip string, port int) {

	//1.创建监听地址  IPv4服务器和IPV6客户端
	srcAddr := &net.UDPAddr{IP: net.IPv6zero, Port: 0}
	
	//2.进行监听
	conn, err := net.ListenUDP("udp", srcAddr)
	if err != nil {
		fmt.Println("net.ListenUDP failed,err:", err.Error())
		return
	}
	defer conn.Close()
	
	//3.写数据  本地模拟一个客户端,向1234端口发送数据
	dstAddr := &net.UDPAddr{IP: net.ParseIP(ip), Port: port}
	conn.WriteToUDP([]byte("hello"), dstAddr)
	fmt.Println("writeToUDP data: hello")
	
	//4.读数据
	data := make([]byte, 5125)
	if _, _, err = conn.ReadFromUDP(data); err != nil {
		fmt.Println("readFromUDP failed ,err:", err.Error())
		return
	}
	fmt.Println("readFromUDP data:", data)
}

测试:centos客户端测试服务端代码

工具:nc(netCat,telnet可以模拟客户端,但只能进行TCP测试)
系统:centos 以IPV6地址互相联通,配置方法;
测试方法:
(1)centos模拟本地客户端:centos终端输入:nc -6lup 777
(2) 另一台运行服务端代码 ,进行数据发送

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值