누군가 TCP 소켓의 keepAlive 기능을 언급했습니다. 여기에 잘 설명되어 있습니다.
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
이 방법으로 사용하고 있습니다. 소켓이 연결된 후이 함수를 호출하여 keepAlive를 설정합니다. 이 keepAliveTime
매개 변수는 첫 번째 연결 유지 패킷이 전송 될 때까지 활동이없는 제한 시간 (밀리 초)을 지정합니다. 이 keepAliveInterval
매개 변수는 승인이 수신되지 않은 경우 연속 연결 유지 패킷이 전송되는 간격 (밀리 초)을 지정합니다.
void SetKeepAlive(bool on, uint keepAliveTime, uint keepAliveInterval)
{
int size = Marshal.SizeOf(new uint());
var inOptionValues = new byte[size * 3];
BitConverter.GetBytes((uint)(on ? 1 : 0)).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)keepAliveTime).CopyTo(inOptionValues, size);
BitConverter.GetBytes((uint)keepAliveInterval).CopyTo(inOptionValues, size * 2);
socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
}
또한 비동기 읽기를 사용하고 있습니다.
socket.BeginReceive(packet.dataBuffer, 0, 128,
SocketFlags.None, new AsyncCallback(OnDataReceived), packet);
그리고 콜백에서 여기 timeout을 잡았 SocketException
는데, 이는 연결 유지 패킷 후 소켓이 ACK 신호를 얻지 못할 때 발생합니다.
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = socket.EndReceive(asyn);
}
catch (SocketException ex)
{
SocketExceptionCaught(ex);
}
}
이렇게하면 TCP 클라이언트와 서버 간의 연결 끊김을 안전하게 감지 할 수 있습니다.