Eu acho que a idéia geral é que seu programa deve tentar ligar-se à porta com uma função e, em seguida, você deve verificar o valor de retorno para certificar-se de que a ligação foi bem-sucedida. Se não obtiver êxito, você errará. Isso vem de uma perspectiva * nix, mas fiquei com a impressão de que isso é bem universal.
A razão pela qual eu sinto que é universal é que, idealmente, a porta de verificação e a ligação à porta precisariam ser atômicas. Isso, nesse uso, significa que nenhum outro programa tem a chance de usar a porta entre quando a verificação é feita e a porta é alocada. No caso de usar algo como o netstat primeiro, é possível, entre o seu teste e tentar usar a porta, algo mais o terá usado.