private void BeginSend() { if (_running == 0) { return; } RawData raw; if (!_sendingQueue.TryDequeue(out raw)) { System.Threading.Interlocked.Exchange(ref _writing, 0); return; } UDPSocket socket = _socket; IPEndPoint remoteEP = (IPEndPoint)raw.EndPoint; if (remoteEP.AddressFamily == AddressFamily.InterNetwork) { if (_socketBackup != null) { // use the separated socket of IPv4 to deal with IPv4 conversions. socket = _socketBackup; } else if (_socket.Socket.AddressFamily == AddressFamily.InterNetworkV6) { remoteEP = new IPEndPoint(IPAddressExtensions.MapToIPv6(remoteEP.Address), remoteEP.Port); } } BeginSend(socket, raw.Data, remoteEP); }
public void TestMapBetweenIPv4AndIPv6() { for (Byte i = 0; i < Byte.MaxValue; i++) { IPAddress ipv4 = new IPAddress(new Byte[] { 10, 0, 0, i }); IPAddress ipv6 = IPAddressExtensions.MapToIPv6(ipv4); Assert.IsTrue(IPAddressExtensions.IsIPv4MappedToIPv6(ipv6)); IPAddress ipv4Mapped = IPAddressExtensions.MapToIPv4(ipv6); Assert.AreEqual(ipv4, ipv4Mapped); } }
private void EndReceive(UDPSocket socket, Byte[] buffer, Int32 offset, Int32 count, System.Net.EndPoint ep) { if (count > 0) { Byte[] bytes = new Byte[count]; Buffer.BlockCopy(buffer, 0, bytes, 0, count); if (ep.AddressFamily == AddressFamily.InterNetworkV6) { IPEndPoint ipep = (IPEndPoint)ep; if (IPAddressExtensions.IsIPv4MappedToIPv6(ipep.Address)) { ipep.Address = IPAddressExtensions.MapToIPv4(ipep.Address); } } FireDataReceived(bytes, ep); } BeginReceive(socket); }