....
This commit is contained in:
@@ -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 는 현재 깨끗하며 사용 가능한 상태입니다.")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user