TCP всегда двусторонний. Там нет «отправить и забыть», как с UDP. Первая программа должна открыть серверный сокет. Это означает, что он прослушивает порт 25 для SYN TCP (флаг, который сигнализирует об открытии соединения). Если ваша вторая программа подключается к порту 25 (от порта 45000), это соединение идентифицируется 4 значениями: IP вашего хоста, порт вашего хоста, IP удаленного хоста, порт удаленного хоста. В этот момент, когда выполняется трехстороннее рукопожатие (SYN, SYN ACK, ACK), первая программа получает клиентский сокет из возвращенного сокета сервера, который подключен к вашей второй программе. Так что да, как только соединение установлено, это двусторонняя связь, и вы уязвимы.
Брандмауэры в основном блокируют входящий трафик. Если ваша первая программа находилась за брандмауэром и неправильно настроила брандмауэр, брандмауэр отбрасывает пакеты SYN из второй программы. Нет подключения будет сделано. Брандмауэр также может проверять исходящие соединения, если он настроен правильно.
Как я уже сказал. Как только вы подключились к удаленной программе, удаленная программа получает клиентский сокет, как и ваша локальная программа, через который осуществляется вся связь.