Wow! That's a lot of sample code. I'll give you an overview and see how it works for you.
As StefonA said you do need a List or a dictionary (I think it's a preferance thing, some may argue). Create a method that uses Socket.ConnectAsync. On your Completed event accept the socket and store it in your dictionary. You can form all your connections
with a few lines of code. Here's a quick example, not debugged so beware.
private List<Socket> ConnectionList = new List<Socket>();
public ClientConnection(string ipaddress,int port)
{
EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Parse(ipaddress), port);
Socket _tSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed +=new EventHandler<SocketAsyncEventArgs>(args_Completed);
args.RemoteEndPoint = ServerEndPoint;
_tSock.ConnectAsync(args);
}
private void args_Completed(object sender, SocketAsyncEventArgs e)
{
ConnectionList.Add ((Socket)sender) ;
}