Search Unity

LiteNetLib - another reliable udp library.

Discussion in 'Multiplayer' started by RevenantX, Jun 30, 2016.

  1. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Yes. in theory you can set int.Max) If you hardware can handle so many clients)
     
  2. emrys90

    emrys90

    Joined:
    Oct 14, 2013
    Posts:
    657
    Alright thanks for all the quick replies!
     
  3. QPRocky

    QPRocky

    Joined:
    Oct 17, 2012
    Posts:
    56
    Hi, I tried play around but were unable to get server or client working.
    http://pp.kpnet.fi/kmje/server.txt
    http://pp.kpnet.fi/kmje/client.txt

    For server, I used Visual studio 2017 and .Net Core. (LiteNetLibNetCore.dll 1.0.0)
    For client, I used Visual studio 2015 & Unity. (LiteNetLib.dll 1.0.6304.36125)

    Nothing gets debugged in server or client.
    Any clue, what maybe wrong?
     
  4. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Hi!. For client you must call Connect method after start. (And on client you can call Start method without port)
     
  5. QPRocky

    QPRocky

    Joined:
    Oct 17, 2012
    Posts:
    56
    Oh right, thanks. :)
     
  6. emrys90

    emrys90

    Joined:
    Oct 14, 2013
    Posts:
    657
    I noticed that NetDataReader.GetString takes one parameter of maxLength, but NetDataWriter.Put(string) does not take one. Why the discrepancy? Should there not be two versions for each method where one restricts max length and the other does not?
     
  7. QPRocky

    QPRocky

    Joined:
    Oct 17, 2012
    Posts:
    56
    Hi again. In github, there is wiki about NetSerializer, but
    Subscribe method seems to be changed since that wiki.
    How it is used at moment?
     
  8. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Fixed this by latest commit.
     
  9. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Fixed wiki. There is documentation inside methods that can help you. I will update wiki with new methods later when have time.
     
  10. emrys90

    emrys90

    Joined:
    Oct 14, 2013
    Posts:
    657
    Thanks!
     
  11. emrys90

    emrys90

    Joined:
    Oct 14, 2013
    Posts:
    657
    I'm getting this error message, any thoughts on what could be going wrong?
    ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
    at System.Buffer.BlockCopy (System.Array src, Int32 srcOffset, System.Array dst, Int32 dstOffset, Int32 count) [0x000b7] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Buffer.cs:116
    at LiteNetLib.Utils.NetDataReader.GetBytesWithLength () [0x0000e] in D:\projs\LiteNetLib\LiteNetLib\Utils\NetDataReader.cs:327
    at ClientRequestServerListToken.Read (LiteNetLib.Utils.NetDataReader reader) [0x0001f] in C:\Users\Jesse\Documents\repos\Unity\exile\Assets\_Code\MasterServer\Tokens\ClientRequestServerListToken.cs:39

    That's in my deserialize method which is this
    Vendor = (Vendor)reader.GetByte();
    VendorAccountId = reader.GetString(int.MaxValue);

    UdpPacket packet = new UdpPacket(reader.GetBytesWithLength());
    FiltersDTO filters = new FiltersDTO();
    filters.Read(packet);

    And my serialize method is
    writer.Put((byte)Vendor);
    writer.Put(VendorAccountId);

    UdpPacket packet = new UdpPacket(MasterServer.Buffer);
    Filters.Write(packet);
    writer.PutBytesWithLength(packet.DuplicateData());

    EDIT:
    I added in some debug logs and the length of the data array in deserialize is 67, after the first two gets the position is at 7 (which seems inaccurate, pretty sure the string is much longer than that, it's a mac address currently), and then manually read the of the byte array using GetInt and it was some huge numbers in the millions range when it should be 39.

    EDIT2:
    After looking at the source I think my problem will be fixed with the new GetString method.

    EDIT3:
    I updated to the newest build, switched it to the new GetString method, and I'm no longer having any issues.
     
    Last edited: Apr 8, 2017
  12. QuadrantGames

    QuadrantGames

    Joined:
    Jan 10, 2016
    Posts:
    8
    Hey I am using your library and like the simplicity and ease of use of everything, I have a question, which may be a general networking question, but I want to know if there is a suggested/specific way of doing things with LiteNetLib. If I have multiple clients connected to a game server through an app, and the user closes the app or the app crashes, what is the proper way to detect and disconnect those peers? Currently those peers remain connected and the latency updates keep coming in even though the user is no longer in the app (since they didnt proper follow shutdown procedure or crashed).
     
  13. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    DisconnectTimeout in NetManager - handle this. If you set this to 5000 (milliseconds) then clients will be kicked after 5 seconds when they crashed (or some other circumstances)
     
  14. QuadrantGames

    QuadrantGames

    Joined:
    Jan 10, 2016
    Posts:
    8
    I've tried this : I'm connecting to my server in unity editor, then when I stop unity the server keeps pinging my client because I never disconnect from the internet. I don't ever get the timeout message on the server until I start the editor again and reconnect.
     
    Last edited: Jun 11, 2017
  15. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Do you call "netManager.Stop" on client in "OnApplicationQuit" method? (or in "OnDestroy")?
    Because library works in another thread. And this thread can be alive when you playing from Unity editor.
     
    ivan866 likes this.
  16. QuadrantGames

    QuadrantGames

    Joined:
    Jan 10, 2016
    Posts:
    8
    That was the key information! Everything works for now, thanks for the fast reply!
     
  17. QuadrantGames

    QuadrantGames

    Joined:
    Jan 10, 2016
    Posts:
    8
    Ok so the LiteNetLib dll I am using for unity came from SampleUnity branch. My client app builds and runs fine on android, but I am having an error when building for iOS.
    I add the appropriate link.xml lines :
    <assembly fullname="LiteNetLib">
    <namespace fullname="LiteNetLib" preserve="all"/>
    <namespace fullname="LiteNetLib.Utils" preserve="all"/>
    </assembly>

    But when I try to build I get an error :
    System.Exception: Error processing method: 'System.Void LiteNetLib.NetUtils::DebugWriteLogic(System.ConsoleColor,System.String,System.Object[])' in assembly: 'LiteNetLib.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve System.Void System.Console::set_ForegroundColor(System.ConsoleColor)

    In addition a long stripping exception which may or may not be related starting with:
    Exception: /Applications/Unity/Unity.app/Contents/Tools/UnusedByteCodeStripper2/UnusedBytecodeStripper2.exe did not run properly!

    Any ideas?
     
  18. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Use "UNITY" flags when compile LiteNetLib.dll. Or just put library sources to your unity project and add "UNITY" flag to compile options in Unity3d.
     
    Last edited: Jun 11, 2017
  19. QuadrantGames

    QuadrantGames

    Joined:
    Jan 10, 2016
    Posts:
    8
    So I got it working by trying the Mono2x backend rather than the il2cpp, I didn't realize I could use that with iOS. Cheers
     
  20. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Better will be using library sources inside your Unity3d project.
     
  21. RyuHayaboosa

    RyuHayaboosa

    Joined:
    Mar 8, 2015
    Posts:
    14
    Hi RevenantX,

    I need to stream images out of Unity to another application (preferably very quickly). Does your library handle files that are larger than the standard UDP packet size (64kb I think)?

    Thanks!
     
  22. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Yes. For ReliableOrdered and ReliableUnordered type of packets.
    There some additional info:
    So if you need send larger data - better will be fragment image manually. Also when you fragment manually you can show nice progressbar in your game/program.
     
  23. HeadGames115

    HeadGames115

    Joined:
    Feb 23, 2016
    Posts:
    4
    Hey RevenantX. I have to say, I love your library. It was the only library I could find that could give me the direct connection access I needed for my application.

    I am having an issue though. I'm using my application on the unity editor and I have a build for it on my cell phone. I can establish a connection from the phone to the computer and get Debug information about the connection, but I cannot connect the opposite direction. When I connect from computer to phone the only Debug I get is the OnPeerDisconnected. The reason listed is ConnectionFailed. Any suggestions on what to adjust?

    Here's the relevant scripting.

    client-----

    void Update()

    if (startClient)
    {
    gameObject.GetComponent<mainController>().StopServer();
    client = new NetManager(this, oKY);
    int prt;
    int.TryParse(oPT, out prt);
    client.Start();
    client.NatPunchEnabled = true;
    client.Connect(oIP, prt);
    startClient = false;
    clnt = true;
    }

    if (clnt)
    {
    client.PollEvents();
    if (nP != null)
    {
    nP.Send(oBPacket.oBV, SendOptions.ReliableOrdered);
    }
    }

    }

    public void BeginClient()
    {
    startClient = true;
    }

    public void EndClient()
    {
    client.Stop();
    }

    public void OnNetworkError(NetEndPoint endPoint, int socketErrorCode)
    {
    Debug.Log("OnNetworkError");
    cam.GetComponent<deviceCamController>().IO = false;
    clnt = false;
    }

    public void OnNetworkLatencyUpdate(NetPeer peer, int latency)
    {

    }

    public void OnNetworkReceive(NetPeer peer, NetDataReader reader)
    {
    Debug.Log("OnNetworkReceive");
    cam.GetComponent<deviceCamController>().processIB(reader.Data);
    }

    public void OnNetworkReceiveUnconnected(NetEndPoint remoteEndPoint, NetDataReader reader, UnconnectedMessageType messageType)
    {
    Debug.Log("OnNetworkReceiveUnconnected");
    }

    public void OnPeerConnected(NetPeer peer)
    {
    Debug.Log("OnPeerConnected");
    cam.GetComponent<deviceCamController>().IO = true;
    peer.Send(oBPacket.oBV, SendOptions.ReliableOrdered);
    dBug.GetComponent<Text>().text = dBug.GetComponent<Text>().text + "Peer connected";
    nP = peer;
    }

    public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
    {
    Debug.Log("OnPeerDisconnected");
    dBug.GetComponent<Text>().text = dBug.GetComponent<Text>().text + "Peer Disconnected";
    Debug.Log(peer.EndPoint.Host);
    Debug.Log(disconnectInfo.Reason);
    dBug.GetComponent<Text>().text = dBug.GetComponent<Text>().text + disconnectInfo.Reason;
    cam.GetComponent<deviceCamController>().IO = false;
    clnt = false;
    nP = null;
    }

    ------------------------------------------------------------------------------------------------------------------------------------------------------------



    server------

    void Update()

    if (!start && srvr)
    {
    ServerTest();
    start = true;
    }
    }


    public void ServerTest()
    {
    server = new NetManager(this, 5, ky + "");
    server.NatPunchEnabled = true;
    server.Start(prt);
    server.DiscoveryEnabled = true;
    thread = new Thread(new ThreadStart(UpdateHandler));
    thread.Start();
    }

    public void StopServer()
    {
    server.Stop();
    srvr = false;
    }

    private void UpdateHandler()
    {
    while (true)
    {
    server.PollEvents();
    Thread.Sleep(15);
    }
    }

    public void OnNetworkError(NetEndPoint endPoint, int socketErrorCode)
    {
    Debug.Log("Network Error");
    cam.GetComponent<deviceCamController>().IO = false;
    }

    public void OnNetworkLatencyUpdate(NetPeer peer, int latency)
    {

    }

    public void OnNetworkReceive(NetPeer peer, NetDataReader reader)
    {
    Debug.Log("Network Packet Received");
    cam.GetComponent<deviceCamController>().processIB(reader.Data);
    }

    public void OnNetworkReceiveUnconnected(NetEndPoint remoteEndPoint, NetDataReader reader, UnconnectedMessageType messageType)
    {
    Debug.Log("Received Unconnected Packet");
    Debug.Log(remoteEndPoint.Host);
    }

    public void OnPeerConnected(NetPeer peer)
    {
    Debug.Log("Peer Connected");
    dBug.GetComponent<Text>().text = dBug.GetComponent<Text>().text + "Peer Connected";
    peer.Send(oBPacket.oBV, SendOptions.ReliableOrdered);
    cam.GetComponent<deviceCamController>().IO = true;
    }

    public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
    {
    Debug.Log("Peer Disconnected");
    dBug.GetComponent<Text>().text = dBug.GetComponent<Text>().text + "Peer Disconnected";
    cam.GetComponent<deviceCamController>().IO = false;
    }
     
  24. HeadGames115

    HeadGames115

    Joined:
    Feb 23, 2016
    Posts:
    4
    I'm now getting an error when I make a connection from the computer stating that getcomponentfastpath can only be called during the main function. the line information says that the error is on the server side and that the error lies in the line

    server.PollEvents()

    Any suggestions?
     
  25. mgear

    mgear

    Joined:
    Aug 3, 2010
    Posts:
    6,829
  26. HeadGames115

    HeadGames115

    Joined:
    Feb 23, 2016
    Posts:
    4
    I edited the GetComponent part just after posting my question, setting it to use GetComponent at Start(). I'm now getting an error stating get_isActiveAndEnabled can only be called on the main thread.

    I'm assuming the same suggestion still applies?
     
  27. HeadGames115

    HeadGames115

    Joined:
    Feb 23, 2016
    Posts:
    4
    i resolved the issue with the main thread. I just made it call a method instead.
     
  28. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Call PollEvents method in MonoBehaviour.Update. You don't need another thread for that. PollEvents created precisely for this. ( example: https://github.com/RevenantX/LiteNetLib/blob/master/LiteNetLibSampleUnity/Assets/GameClient.cs )

    About connection - check android permissions.
     
  29. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    New release is available 0.7.6! Changelog since 0.7.4 (prerelase)
    • Added bool array support to NetSerializer
    • Improved NetUtils.GetLocalIp method
    • Fixed NetSerializer for UWP
    • Fixed NetDataWriter.PutBytesWithLength
    • Fixed packet loss simulation
    • Fixed "deserialize" method name
    • Fixed packet sizes for unconnected messages
    • Fixed sequenced channel
    • Fixed NetPeer ConnectRequest bug
    • Fixed packet leaks
    • Fixed Android IL2CPP crash (unity3d related)
    https://github.com/RevenantX/LiteNetLib/releases/tag/0.7.6
    https://www.nuget.org/packages/LiteNetLib/
     
  30. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521

    Can you please make a tutorial on this for those who are new to implementing networking for their games.. i tried the example code, and unity client just crashed completely. And theres no real documentation on how to build an actual server properly. Seems we already need to be well knowledge on the subject to just be able to use the library which is kinda disappointing.

    When i poll events on the client i constantly get:
    It works for a while then suddenly says it.
    Code looks like this:
    Code (CSharp):
    1.     public class NetBrain : MonoBehaviour
    2.     {
    3.         private NetManager client { set; get; }
    4.         private ClientListener listener { set; get; }
    5.  
    6.         void Awake()
    7.         {
    8.             client = new NetManager(listener, "SomeConnectionKey");
    9.  
    10.             if (client.Start()) client.Connect("localhost", 9050);
    11.          
    12.         }
    13.  
    14.  
    15.         void Update()
    16.         {
    17.             client.PollEvents();   // why is this a null reference after some seconds?
    18.         }
    19.     }
     
    Last edited: Oct 15, 2017
  31. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Because your ClientListener is null. For unity3d projects better use library source code.
    And there is documentation: https://github.com/RevenantX/LiteNetLib/blob/master/HelpBuilder/Help/Documentation.chm
     
  32. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521
    Yeah it turned out windows ten blocked it i had to go to properties and unblock the file for some reason.

    One thing i am not clear on is what discovery is all about and the whole unconnected message methods?

    Also when i do connect OnNetworkLatencyUpdate seems to run every second, is this a keep alive thing? My game is a very slow turn based game so i could get away with this being much less frequent, is there any way to reduce it? I tried changing ping interval and update time but i'm not clear what they do either.

    Hope you can clarify, as the documentation file doesn't have much description on what they are for.
     
  33. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    From Github page:
    • UpdateTime
      • library logic update (and send) period in milliseconds
      • default value: 100 msec. For games you can use 15 msec (66 ticks per second)
    • PingInterval
      • Interval for latency detection and checking connection
      • default value: 1000 msec.
    If you want that OnNetworkLatencyUpdate method was called less frequesnt - you must use PingInterval

    > is this a keep alive thing

    Yes. And ping.

    > One thing i am not clear on is what discovery is all about and the whole unconnected message methods?

    Discovery (broadcasting) - used for searching active games, servers in local network)
     
  34. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521
    Changing the value of ping interval, doesn't actually change the frequency of how often OnNetworkLatencyUpdate occurs for me? It seems the only way to reduce that is change the RTT value but thats not changeable normally. If you change the ping interval should it not also change how often the RTT is done ? Constantly calling the OnNetworkLatencyUpdate when your interval is super low (like 30 seconds) is a lot of wasted overhead for method calls isn't it ? Unless it serves additional purposes that i don't understand.
     
  35. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    There is no overhead. Yes i found that it called every second constantly - after calculating average ping. But there is no overhead.
    And if you game is very slow - why you need reliable UDP protocol?
     
    ivan866 likes this.
  36. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521
    I'm developing a rather heavy multiplayer for mobile udp is far less overhead than tcp. I've modified the rtt to 30 seconds now to remove the frequent method call so to save battery life.
     
  37. friuns3

    friuns3

    Joined:
    Oct 30, 2009
    Posts:
    295
    Hi what game is that if not secret)?
     
  38. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Blockfield (cubeguncraft) - Ace Of Spades clone. But for now i don't have time to continue that project.
    There are 2 videos on youtube just with tests.
     
  39. friuns

    friuns

    Joined:
    Jan 14, 2016
    Posts:
    23
    what about other projects?
     
  40. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Last edited: Oct 31, 2017
    olonge likes this.
  41. friuns

    friuns

    Joined:
    Jan 14, 2016
    Posts:
    23
    P.S. Forgot about EditorConsolePro plugin
    ah yes that how i found your library :p
     
  42. -chris

    -chris

    Joined:
    Mar 1, 2012
    Posts:
    66
    Thanks @RevenantX, networking and more has been coming along this year for Tallowmere 2 thanks to LiteNetLib.

    Here is a video I've taken just now, showing PC and Android networking happening on a LAN over wifi:


    It takes a while for me to type out the serialization and deserialization code, but LiteNetLib's core offerings of NetDataWriter.Put and NetDataReader.Get allow me to store and read exactly what I need.

    In Tallowmere 2's dungeons, there are blocks, creatures, blood splats, coins, and dismembered body parts strewn about, all within randomly-generated rooms with random seeds, including treasure chests with randomised loot. To be able to have a player join at any point and jump in, I know I needed everything in the current room to be synced 1:1, so I've taken the effort to ensure everything is serialized with NetDataWriter and NetDataReader.

    This has the great effect that, when a player joins, I've coded it so the host takes a snapshot of the current room and sends the byte array to the client, whom then reads the bytes and instantiates everything as needed. I Put header bytes to declare what is in the byte array, then Put appropriate bytes in after each header, and also Put a stop byte in some cases where multiple things are deeply nested. And when it comes to sending a network command, again, a header byte to define what the message is, followed by whatever other bytes your packet needs - that's the core of it.

    Figuring out how to order your bytes and track your own "networked" objects has to be done by hand, but you get the benefit of coding it yourself, rather than trying to shoehorn your code around someone else's existing over-complicated "networking manager" plugin that might not fit your needs. So, it's definitely work to make it happen, but it's achievable, and you can fine-tune each packet exactly as you want.

    On the plus side... The same bytes that I send to a client, I can store to disk as a savefile. And because everything is serialized 1:1, this has allowed me to implement a Quick Save / Quick Load feature, akin to Half-Life or Skyrim. Saving is instantaneous, and (thanks to object pooling), loading takes less than 2 seconds typically to put things back to their previous state. The magic of writing and reading bytes by hand. It largely comes down to storing byte IDs of prefabs, storing vector positions, adding netIDs for objects you want to be able to lookup later, and any other data needed to recreate where and what something was doing.

    LiteNetLib offers a very simple API with full control to host or connect (allowing multiple hosts or connections on a single Unity instance), and the included byte writer and reader are fantastic. And being able to extend the various Put and Get methods for my own classes is great.

    So, thank you, @RevenantX :)
     
    TheBrizleOne, RevenantX and friuns like this.
  43. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    Thank you @-chris for detailed response) I'm very glad that you like this)
    I like your game and waiting for new release)
     
    Last edited: Nov 1, 2017
    -chris likes this.
  44. friuns

    friuns

    Joined:
    Jan 14, 2016
    Posts:
    23
    Any plans implement websockets to support webgl? eg. Photon Network does that.
    Then would be possible make multiplatform game that supports both browser and pc stand alone multiplayer.
     
  45. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    I have no time for this. And websockets doesn't support UDP sockets, so RUDP library is nosense in web.

    I think i need some F.A.Q. for this questions.
     
  46. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521
    Could you add a planned updates/features so we also don't request things already planned?
     
  47. RevenantX

    RevenantX

    Joined:
    Jul 17, 2012
    Posts:
    144
    planned features already at github in issues page
     
  48. PixelizedPlayer

    PixelizedPlayer

    Joined:
    Feb 27, 2013
    Posts:
    521
    Hi

    I'm a bit stuck with my setup. I have been testing with "localhost" as the string address for a while and it worked perfectly. So i switched it to my machine ip address to simulate being an actual player hosting a match and the client connects to that address. The problem is now the client net manager never connects. Both client and server and different game objects in the scene in this example.

    I enabled NAT punch through on both the server and client net managers to see if that would solve it, but that didn't work. Do you have any advice on how i can diagnose why this ain't working? Or is it because i am trying to connect to an ip address that the client is also connected to? I'm not sure whats really going wrong.

    I basically just end up getting OnPeerDisconnect with DisconnectReason.ConnectionFailed. If i switch back to "localhost" as the address, it works perfectly fine so i must be missing something with the setup.
     
  49. Skylander17

    Skylander17

    Joined:
    Jul 16, 2014
    Posts:
    4
    Hello,
    It would be super if you would prepare one training video about your nat hole punching. Because I can't figure out which part is sending both device ip addreses to masterserver and which codes must work on masterserver. Or do I need a master. As far as I know, UDP hole punching needs a master server to give information both device about other devices ip and port numbers. With that information talk between master server and devices, and devices keep talking each other with this same UDP channel. Otherwise external port remotely changing by ISP. And devices can't find each other on same IP and port in next trying to connect.

    Check this computer science proffesor's website article: http://www.brynosaurus.com/pub/net/p2pnat/
    Section "3.4 Peers behind nat" is about my question.

    Thank's.
     
  50. Reddoge

    Reddoge

    Joined:
    Feb 19, 2016
    Posts:
    10
    I am really liking the library! I am trying to build a client server instead of peer to peer but seem to be running into an issue. I am attempting to send information to the server but have no way that I could find to do so. I am attempting to set an endpoint of the server but I cannot do so manually. What am I doing wrong? I tried looking at the documentation on the repository but it did not seem to be working. IE. How do I switch from using localhost to using whatever IP I desire. Thank you.
     
    Last edited: Dec 4, 2017
unityunity