With the increasing popularity of the Internet and the rise of the Internet of Things, IPv4 addresses are far from enough. The popularization of IPv6 is an inevitable trend. In the past, most of our socket programs were developed for IPv4. Without upgrading and restructuring, clients using IPv6 addresses would not be able to use the services provided by the server. How can I enable both the server and client to support IPv6 at the same time like ESFramework? So that our P2P holes are also compatible with IPv6? The following are the key points.
First, we need to understand two basic facts:
(1) Both Parties must use the same protocol version-either IPv4 or IPv6.
(2) When no attachment is installed, some operating systems may only support IPv4, some may only support IPv6, and some may support IPv4 and IPv6. You can use the OSSupportsIPv6 and OSSupportsIPv4 attributes of the Socket class for determination.
1. TCP Server
To enable the TCP server to receive requests from clients with IPv4 addresses and IPv6 address clients, the Server OS must support IPv4 and IPv6. By default, windows 2003 Server only supports IPv4 and supports IPv6.
Then, when writing a server program, you must listen to both the IPv4 address and IPv6 address of the local machine, and listen to the same port of the two addresses. For example, as shown below:
int port = 9900; TcpListener tcpListenerV4 = new TcpListener(IPAddress.Any, port); TcpListener tcpListenerV6 = new TcpListener(IPAddress.IPv6Any, port);
In this way, the client can be accepted by the server when it initiates a connection request to the server, whether it is IPv4 or IPv6.
Ii. TCP client
Now we assume that the server program is compatible with IPv6, and its IPv4 address is 192.168.0.104 and the IPv6 address is fe80: 14d8: a209: 89e6: c162 % 14.
Before establishing a connection with the server, the TCP client depends on the local OS's support for IPv4 and IPv6:
(1) If the local OS only supports IPv4, or both IPv4 and IPv6, connect it to the IPv4 address of the server. The sample code is as follows:
TcpClient client = new TcpClient(AddressFamily.InterNetwork); client.Connect("192.168.0.104", 9900);
(2) If the local OS only supports IPv6, connect it to the IPv6 address of the server. The sample code is as follows:
TcpClient client = new TcpClient(AddressFamily.InterNetworkV6); client.Connect("fe80::14d8:a209:89e6:c162%14", 9900);
Iii. UDP
For UDP, the server and client can adopt the same model. It is a little complicated to make UDP-based applications compatible with IPv6.
(1) create two UdpClient instances, one for IPv4 and the other for IPv6. The sample code is as follows:
int port = 9800; UdpClient udpClient4 = new UdpClient(port, AddressFamily.InterNetwork); UdpClient udpClient6 = new UdpClient(port ,AddressFamily.InterNetworkV6);
(2) the method for receiving data needs to be called on two UdpClient instances to receive data.
(3) When sending data, you need to select the correct UdpClient instance based on whether the destination address is IPv4 or IPv6. The sample code is as follows:
public void Send(byte[] data, IPEndPoint endPoint) { if (endPoint.AddressFamily == AddressFamily.InterNetwork) { this.udpClient4.Send(data, data.Length, endPoint); } else { this.udpClient6.Send(data, data.Length, endPoint); } }
In the preceding example, we assume that the current OS supports both IPv4 and IPv6. If only one of them is supported, we should create only one udpClient4 or udpClient6 instance.
4. P2P and IPv6
If both our TCP client and UDP have been restructured and upgraded in a similar way, whether it is TCP-based P2P or UDP-Based P2P, its Logic code can be fully compatible with IPv6.
This article only lists the key points of rebuilding and upgrading the Socket Application to support IPv6. In the actual implementation process, there are still many details to deal, in a complex environment. I will not go into details here. If you have any questions, you can leave a message for discussion. Thank you.