По идее если сервис падает, то он освобождает порт.
Это только по вашей идее.
На самом деле порт может быть еще какое-то время занят пока не придет пакет с установленным флагом FIN или не закончится тайм-аут ожидания такого пакета. Так работает протокол TCP.
Обычно, что бы избежать ожидания закрытия порта, порт открывают с указанием флага SO_REUSEADDR.
Возможно программа падает потому, что происходит обрыв соединения. Возможно у вас не корректно обрабатывается эта ситуация (если вообще обрабатывается).
На счет рестарта - возможно стоит оформить ваш сервис как виндовую службу, тогда за рестарт будет отвечать виндовый Service Manager. И не понадобится костыль в виде батника.