Well in networking there are 2 main categories: peer-to-peer and server-client.

However when you are working within an application's code you have to think a little differently.

You see if you have a single peer-to-peer between 2 clients, one will have to act as the server or master, yes. So they will usually setup 'the game' from which the other will connect to. There are lots of fancy ways to manage this, but this is the way that the TCP/UDP protocols work.

As for which is better. I cannot say, thats up to you to try and see which you prefer. Though I am more familiar with Indy and it does have a component suite for both Delphi and Lazarus if you ever wanted to go cross-platform.

Others that you can use include sdl_net which comes with the JEDI-SDL package. Dean Ellis wrote a few articles on how to work with it. Just take a look in the Article section for his small series.

If you wanted , you could also use DirectPlay, but I don't think it's used or supported anymore.

If you wanted to get all hardcore you can also just use one of the sockets units that come with either FPC or Delphi. But thats a bit low-level and you might not want to start off like that as almost everything would need to be done from scratch.

Don't really know of any others. Just take a look at those and try the demos/examples read up and see which you feel would be better to start with. You can always switch later so long as you code your project well enough.