diff --git a/Lidgren.Network.sln b/Lidgren.Network.sln index 58670a5..71d1822 100644 --- a/Lidgren.Network.sln +++ b/Lidgren.Network.sln @@ -26,6 +26,7 @@ Global {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x86.ActiveCfg = Release|Any CPU {6691874A-1766-4A08-A72A-B1132FAB8E58}.Debug|Any CPU.ActiveCfg = Debug|x86 + {6691874A-1766-4A08-A72A-B1132FAB8E58}.Debug|Any CPU.Build.0 = Debug|x86 {6691874A-1766-4A08-A72A-B1132FAB8E58}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {6691874A-1766-4A08-A72A-B1132FAB8E58}.Debug|Mixed Platforms.Build.0 = Debug|x86 {6691874A-1766-4A08-A72A-B1132FAB8E58}.Debug|x86.ActiveCfg = Debug|x86 diff --git a/Lidgren.Network/Encryption/NetXorEncryption.cs b/Lidgren.Network/Encryption/NetXorEncryption.cs index aab1f29..980f116 100644 --- a/Lidgren.Network/Encryption/NetXorEncryption.cs +++ b/Lidgren.Network/Encryption/NetXorEncryption.cs @@ -24,7 +24,7 @@ namespace Lidgren.Network /// public NetXorEncryption(string key) { - m_key = Encoding.ASCII.GetBytes(key); + m_key = Encoding.UTF8.GetBytes(key); } /// diff --git a/Lidgren.Network/Encryption/NetXteaEncryption.cs b/Lidgren.Network/Encryption/NetXteaEncryption.cs index 8e9d62b..bb10d89 100644 --- a/Lidgren.Network/Encryption/NetXteaEncryption.cs +++ b/Lidgren.Network/Encryption/NetXteaEncryption.cs @@ -82,7 +82,7 @@ namespace Lidgren.Network /// String to hash for key /// public NetXtea(string key) - : this(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key)), 32) + : this(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(key)), 32) { } diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index 4b21d6d..c796039 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -1,4 +1,6 @@ -#define IS_MAC_AVAILABLE +#if !__ANDROID__ && !IOS +#define IS_MAC_AVAILABLE +#endif using System; using System.Net; diff --git a/Lidgren.Network/NetPeer.LatencySimulation.cs b/Lidgren.Network/NetPeer.LatencySimulation.cs index 0f4863f..dc01fd6 100644 --- a/Lidgren.Network/NetPeer.LatencySimulation.cs +++ b/Lidgren.Network/NetPeer.LatencySimulation.cs @@ -131,7 +131,13 @@ namespace Lidgren.Network { // TODO: refactor this check outta here if (target.Address == IPAddress.Broadcast) + { + // Some networks do not allow + // a global broadcast so we use the BroadcastAddress from the configuration + // this can be resolved to a local broadcast addresss e.g 192.168.x.255 + target.Address = m_configuration.BroadcastAddress; m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); + } int bytesSent = m_socket.SendTo(data, 0, numBytes, SocketFlags.None, target); if (numBytes != bytesSent) @@ -175,7 +181,7 @@ namespace Lidgren.Network int bytesSent = m_socket.SendTo(m_sendBuffer, 0, numBytes, SocketFlags.None, target); if (numBytes != bytesSent) LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!"); - + m_statistics.PacketSent(numBytes, 1); } catch (SocketException sx) @@ -295,4 +301,4 @@ namespace Lidgren.Network } #endif } -} +} \ No newline at end of file diff --git a/Lidgren.Network/NetPeerConfiguration.cs b/Lidgren.Network/NetPeerConfiguration.cs index c610d58..794c406 100644 --- a/Lidgren.Network/NetPeerConfiguration.cs +++ b/Lidgren.Network/NetPeerConfiguration.cs @@ -33,6 +33,7 @@ namespace Lidgren.Network private readonly string m_appIdentifier; private string m_networkThreadName; private IPAddress m_localAddress; + private IPAddress m_broadcastAddress; internal bool m_acceptIncomingConnections; internal int m_maximumConnections; internal int m_defaultOutgoingMessageCapacity; @@ -76,6 +77,12 @@ namespace Lidgren.Network m_disabledTypes = NetIncomingMessageType.ConnectionApproval | NetIncomingMessageType.UnconnectedData | NetIncomingMessageType.VerboseDebugMessage | NetIncomingMessageType.ConnectionLatencyUpdated; m_networkThreadName = "Lidgren network thread"; m_localAddress = IPAddress.Any; + m_broadcastAddress = IPAddress.Broadcast; + var ip = NetUtility.GetBroadcastAddress(); + if (ip != null) + { + m_broadcastAddress = ip; + } m_port = 0; m_receiveBufferSize = 131071; m_sendBufferSize = 131071; @@ -285,6 +292,17 @@ namespace Lidgren.Network } } + public IPAddress BroadcastAddress + { + get { return m_broadcastAddress; } + set + { + if (m_isLocked) + throw new NetException(c_isLockedMessage); + m_broadcastAddress = value; + } + } + /// /// Gets or sets the local port to bind to. Defaults to 0. Cannot be changed once NetPeer is initialized. /// diff --git a/Lidgren.Network/NetSRP.cs b/Lidgren.Network/NetSRP.cs index b30ac09..cd0c140 100644 --- a/Lidgren.Network/NetSRP.cs +++ b/Lidgren.Network/NetSRP.cs @@ -69,7 +69,7 @@ namespace Lidgren.Network { var sha = GetHashAlgorithm(); - byte[] tmp = Encoding.ASCII.GetBytes(username + ":" + password); + byte[] tmp = Encoding.UTF8.GetBytes(username + ":" + password); byte[] innerHash = sha.ComputeHash(tmp); byte[] total = new byte[innerHash.Length + salt.Length]; diff --git a/Lidgren.Network/NetUPnP.cs b/Lidgren.Network/NetUPnP.cs index 9b758b5..021a2d7 100644 --- a/Lidgren.Network/NetUPnP.cs +++ b/Lidgren.Network/NetUPnP.cs @@ -35,7 +35,7 @@ namespace Lidgren.Network "MAN:\"ssdp:discover\"\r\n" + "MX:3\r\n\r\n"; - byte[] arr = System.Text.Encoding.ASCII.GetBytes(str); + byte[] arr = System.Text.Encoding.UTF8.GetBytes(str); peer.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); peer.RawSend(arr, 0, arr.Length, new IPEndPoint(IPAddress.Broadcast, 1900)); diff --git a/Lidgren.Network/NetUtility.cs b/Lidgren.Network/NetUtility.cs index 3196c10..b8dd5bf 100644 --- a/Lidgren.Network/NetUtility.cs +++ b/Lidgren.Network/NetUtility.cs @@ -16,7 +16,9 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRA TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#if !__ANDROID__ && !IOS #define IS_FULL_NET_AVAILABLE +#endif using System; using System.Net; @@ -256,12 +258,95 @@ namespace Lidgren.Network } return new string(c); } + + public static IPAddress GetBroadcastAddress() + { +#if __ANDROID__ + try{ + Android.Net.Wifi.WifiManager wifi = (Android.Net.Wifi.WifiManager)Android.App.Application.Context.GetSystemService(Android.App.Activity.WifiService); + if (wifi.IsWifiEnabled) + { + var dhcp = wifi.DhcpInfo; + + int broadcast = (dhcp.IpAddress & dhcp.Netmask) | ~dhcp.Netmask; + byte[] quads = new byte[4]; + for (int k = 0; k < 4; k++) + { + quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); + } + return new IPAddress(quads); + } + } + catch // Catch Access Denied Errors + { + return IPAddress.Broadcast; + } +#endif +#if IS_FULL_NET_AVAILABLE + try + { + NetworkInterface ni = GetNetworkInterface(); + if (ni == null) + { + return null; + } + + IPInterfaceProperties properties = ni.GetIPProperties(); + foreach (UnicastIPAddressInformation unicastAddress in properties.UnicastAddresses) + { + if (unicastAddress != null && unicastAddress.Address != null && unicastAddress.Address.AddressFamily == AddressFamily.InterNetwork) + { + var mask = unicastAddress.IPv4Mask; + byte[] ipAdressBytes = unicastAddress.Address.GetAddressBytes(); + byte[] subnetMaskBytes = mask.GetAddressBytes(); + + if (ipAdressBytes.Length != subnetMaskBytes.Length) + throw new ArgumentException("Lengths of IP address and subnet mask do not match."); + + byte[] broadcastAddress = new byte[ipAdressBytes.Length]; + for (int i = 0; i < broadcastAddress.Length; i++) + { + broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255)); + } + return new IPAddress(broadcastAddress); + } + } + } + catch // Catch any errors + { + return IPAddress.Broadcast; + } +#endif + return IPAddress.Broadcast; + } /// /// Gets my local IP address (not necessarily external) and subnet mask /// public static IPAddress GetMyAddress(out IPAddress mask) { + mask = null; +#if __ANDROID__ + try + { + Android.Net.Wifi.WifiManager wifi = (Android.Net.Wifi.WifiManager)Android.App.Application.Context.GetSystemService(Android.App.Activity.WifiService); + if (!wifi.IsWifiEnabled) return null; + var dhcp = wifi.DhcpInfo; + + int addr = dhcp.IpAddress; + byte[] quads = new byte[4]; + for (int k = 0; k < 4; k++) + { + quads[k] = (byte) ((addr >> k * 8) & 0xFF); + } + return new IPAddress(quads); + } + catch // Catch Access Denied errors + { + return null; + } + +#endif #if IS_FULL_NET_AVAILABLE NetworkInterface ni = GetNetworkInterface(); if (ni == null) @@ -280,7 +365,6 @@ namespace Lidgren.Network } } #endif - mask = null; return null; }