This commit is contained in:
2026-03-27 17:45:51 +09:00
parent 9803b27741
commit 681472df58
6 changed files with 169 additions and 95 deletions
@@ -0,0 +1,53 @@
package util
import java.net.ServerSocket
import java.net.InetSocketAddress
object NetworkPortDiagnostic {
/**
* 특정 포트에 소켓을 직접 열어보고 닫음으로써 네트워크 가용성을 테스트합니다.
*/
fun testPortAvailability(port: Int): Boolean {
return try {
// 1. ServerSocket 생성 및 바인딩 시도
val serverSocket = ServerSocket()
// 타임아웃 2초 설정하여 무한 대기 방지
serverSocket.reuseAddress = true
serverSocket.bind(InetSocketAddress("127.0.0.1", port))
println("✅ [Diagnosis] 포트 $port 개방 성공: 시스템 및 보안 프로그램에서 허용됨.")
// 2. 테스트 성공 후 즉시 포트 닫기
serverSocket.close()
println("✅ [Diagnosis] 테스트 종료 후 포트 $port 정상적으로 다시 닫힘.")
true
} catch (e: Exception) {
println("❌ [Diagnosis] 포트 $port 개방 실패: ${e.message}")
// 에러 메시지에 'Permission denied'가 포함되면 보안 프로그램(안랩 등) 차단일 확률이 높음
false
}
}
/**
* 기존에 구현하신 netstat 방식을 결합하여 상세 로그를 남깁니다.
*/
fun runFullDiagnostic(port: Int) {
val isHardwareReady = testPortAvailability(port)
if (!isHardwareReady) {
println("⚠️ [Alert] OS 레벨에서 포트 $port 사용이 거부되었습니다. 보안 프로그램 설정을 확인하세요.")
return
}
// netstat 실행 로직 (기존 NetworkChecker 활용)
val process = Runtime.getRuntime().exec("cmd /c netstat -ano | findstr :$port")
val result = process.inputStream.bufferedReader().readText()
if (result.contains("LISTENING")) {
println("️ 현재 포트 $port 를 다른 프로세스가 점유 중입니다.")
} else {
println("✅ 포트 $port 는 현재 깨끗하며 사용 가능한 상태입니다.")
}
}
}