linux实例之IPV4和IPV6地址bind同一个端口

叶sir学编程 2024-07-04 10:13:27

在linux系统上开发网络编程时,通常都是服务器端创建套接字并绑定对应的端口,等待客户端的连接。但是由于IPV4地址数量的限制,或者满足客户需求,并且网络环境同时支持IPV4和IPV6,如何让服务器创建套接字并绑定同一个端口呢?

先使用netstat -a命令查看下哪些是支持IPV4和IPV6绑定同一端口:

图1

然后先写一个简易的TCP/IP协议的服务端程序,创建两个套接字,一个用来监听IPV4地址的端口,一个用来监听IPV6地址的端口,如图:

图2

使用gcc编译得到可执行程序后,执行该程序,发现报错,无法绑定:ipv6 bind failed: Address already in use;说明该地址+端口已经被使用了无法重复绑定。

图3

原因是当使用IPV4+端口方式时,服务端会接收IPV4地址的报文,而IPV6+端口的方式,服务端默认也是接收IPV地址的报文,导致冲突,因此需要设置服务端IPV6的套接字只接收IPV6地址的报文,需要在IPV6套接字使用bind函数之前,使用setsockopt函数,如图:

图4

重新使用gcc编译得到可只执行程序,运行,发现没有报错,然后使用netstat -a命令,查看6666端口的使用情况,发现IPV4和IPV6在同时监听6666端口,如图:

图5

0 阅读:3

叶sir学编程

简介:感谢大家的关注