.NET/C#
[C#] 소켓 연결 시도에 타임아웃 넣기
Dv Jm
2021. 7. 14. 18:13
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를 반환하면 연결에 실패한 것이다.