diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs
index c80afc3..6ed899e 100644
--- a/Lidgren.Network/NetPeer.Internal.cs
+++ b/Lidgren.Network/NetPeer.Internal.cs
@@ -123,7 +123,7 @@ namespace Lidgren.Network
mutex.WaitOne();
if (m_socket == null)
- m_socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
+ m_socket = new Socket(m_configuration.LocalAddress.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
if (reBind)
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, (int)1);
@@ -131,7 +131,9 @@ namespace Lidgren.Network
m_socket.ReceiveBufferSize = m_configuration.ReceiveBufferSize;
m_socket.SendBufferSize = m_configuration.SendBufferSize;
m_socket.Blocking = false;
- m_socket.DualMode = true;
+
+ if(m_configuration.DualStack && m_configuration.LocalAddress.AddressFamily == AddressFamily.InterNetworkV6)
+ m_socket.DualMode = true;
var ep = (EndPoint)new NetEndPoint(m_configuration.LocalAddress.MapToIPv6(), reBind ? m_listenPort : m_configuration.Port);
m_socket.Bind(ep);
diff --git a/Lidgren.Network/NetPeer.LatencySimulation.cs b/Lidgren.Network/NetPeer.LatencySimulation.cs
index c221975..5b699c6 100644
--- a/Lidgren.Network/NetPeer.LatencySimulation.cs
+++ b/Lidgren.Network/NetPeer.LatencySimulation.cs
@@ -153,7 +153,7 @@ namespace Lidgren.Network
targetCopy.Port = target.Port;
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
}
- else
+ else if(m_configuration.DualStack && m_configuration.LocalAddress.AddressFamily == AddressFamily.InterNetworkV6)
NetUtility.CopyEndpoint(target, targetCopy); //Maps to IPv6 for Dual Mode
int bytesSent = m_socket.SendTo(data, 0, numBytes, SocketFlags.None, targetCopy);
diff --git a/Lidgren.Network/NetPeer.cs b/Lidgren.Network/NetPeer.cs
index 459e091..c17b776 100644
--- a/Lidgren.Network/NetPeer.cs
+++ b/Lidgren.Network/NetPeer.cs
@@ -303,7 +303,8 @@ namespace Lidgren.Network
{
if (remoteEndPoint == null)
throw new ArgumentNullException("remoteEndPoint");
- remoteEndPoint = NetUtility.MapToIPv6(remoteEndPoint);
+ if(m_configuration.DualStack)
+ remoteEndPoint = NetUtility.MapToIPv6(remoteEndPoint);
lock (m_connections)
{
diff --git a/Lidgren.Network/NetPeerConfiguration.cs b/Lidgren.Network/NetPeerConfiguration.cs
index 4e9f460..b337e6d 100644
--- a/Lidgren.Network/NetPeerConfiguration.cs
+++ b/Lidgren.Network/NetPeerConfiguration.cs
@@ -48,6 +48,8 @@ namespace Lidgren.Network
private string m_networkThreadName;
private IPAddress m_localAddress;
private IPAddress m_broadcastAddress;
+ private bool m_dualStack;
+
internal bool m_acceptIncomingConnections;
internal int m_maximumConnections;
internal int m_defaultOutgoingMessageCapacity;
@@ -341,10 +343,24 @@ namespace Lidgren.Network
}
}
- ///
- /// Gets or sets the local broadcast address to use when broadcasting
- ///
- public IPAddress BroadcastAddress
+ ///
+ /// Gets or sets a value indicating whether the library should use IPv6 dual stack mode
+ ///
+ public bool DualStack
+ {
+ get { return m_dualStack; }
+ set
+ {
+ if (m_isLocked)
+ throw new NetException(c_isLockedMessage);
+ m_dualStack = value;
+ }
+ }
+
+ ///
+ /// Gets or sets the local broadcast address to use when broadcasting
+ ///
+ public IPAddress BroadcastAddress
{
get { return m_broadcastAddress; }
set