Es klingt für mich sehr nach einem Chat/Messanger. Sollte das im Wesentlichen deinem Anwendungsfall entsprechen: Was kann man seitens Anwender erwarten, was er für den Verbindungsaufbau erledigen kann?
Im Idealfall würde es wohl reichen, bei einem der beiden per UPnP einen Port am Router öffnen zu lassen und auf eine eingehende Verbindung zu warten, dem anderen wird die IP-Adresse mitgeteilt (wahrscheinlich kann man Dienste im Internet verwenden, um die eigene, öffentliche IP-Adresse zu ermitteln), der diese bei sich eingibt, damit das Programm sich verbinden kann.
Es sollte also grundsätzlich ohne einen Server möglich sein, allerdings müssen die Nutzer dann auf irgendeinem anderen Weg die IP-Adresse austauschen, man hat keine Kontaktliste, Gesprächsverläufe können nur lokal gespeichert werden usw.
Für das Entwickeln deines Programms kannst du auch lokal arbeiten. Selbst wenn ein Server dazwischen hängt, kannst du diesen lokal laufen lassen und die Instanzen des Programms sich damit verbinden lassen. Solltest du dein Programm anderen geben wollen, könntest du die Weiter-/Umleitung eines Ports im Router einstellen und andere könnten sich dann mit dem Server auf deinem Rechner verbinden.
Es kann auch sein, dass in deinem Fall eine leicht andere Vorgehensweise sinnvoller wäre, allerdings hast du bisher nicht beschrieben, was dein Programm machen soll. (Ich meine damit eine Beschreibung dessen, was das Programm insgesamt machen soll, nicht nur, was bei der Kommunikation passiert.)