본문 바로가기

.NET/C#

[C#] 소켓 연결 시도에 타임아웃 넣기

Socket의 Connect() 메서드는 네트워크 연결을 시도하는 메서드이다.

만약 연결을 요청했을 때 연결이 되거나, 연결이 거부되거나 처럼 응답이 오면 빠르게 넘어갈 수 있으나, 문제는 응답이 없는 경우이다. 응답이 없는 경우 10초 내지 20초의 꽤 긴 시간 동안 응답을 기다리다가 처리가 넘어가게 된다.

 

연결을 요청하는 측에서도 타임아웃을 두고 지정된 시간동안만 대기하는 코드를 소개한다.

public bool ConnectWithTimeout(Socket socket, string ip, int port, int timeOutSec)
{
	var waiter = socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port), null, null);
    
    // WaitOne()의 첫 번째 인수는 대기할 시간을 ms(밀리초) 단위로 넣는다. (1초 = 1000ms)
    if(waiter.AsyncWaitHandle.WaitOne(timeOutSec * 1000, true))
    {
    	socket.EndConnect(waiter);
        if(socket.Connected) return true;
        else return false;
    }
    else 
    {
    	socket.Close();
        return false;
    }
}

위 메서드의 첫 번째 매개변수로 연결할 소켓을, 그리고 IP, Port 및 대기할 시간(초)을 넣어 호출한다.

ConnectWithTimeout()이 true를 반환하면 연결 성공, false를 반환하면 연결에 실패한 것이다.