2011-01-28 2 views
1

새로운 소켓 연결을 기다리는 TcpListener가 있습니다. 새 연결이 설정되면 원격 사용자의 일부 코드 서비스 메시지가 표시됩니다. 정기적으로 새 연결을 확인하고 새 연결이 만들어지면 이전 연결을 삭제해야합니다.TcpClient를 연결 해제하여 새 연결을 허용하려면 어떻게합니까?

이전에 나는 대부분 새로운 연결을 열었습니다. 가끔씩은 같은 포트를 다시 사용하는 데 문제가 있으므로 연결을 닫는 것이 더 좋을 것이라고 생각했습니다 (이전 사용자에게 연결이 끊어 졌다는 표시를 제공해야한다고 생각합니다).

아래 코드는 내 시도이지만, 어떤 이유로 Disconnect 호출이 무기한 차단되는 것 같습니다. 그걸 막을 방법이 있을까요? ... 아니면 내가 여기서 다른 걸 놓치고 있니?

while(1) 
{ 
    // FYI, m_server is a TcpListener^ and m_client is a TcpClient^ 
     // Check for new client connections 
    if (m_server->Pending() == true) 
    { 
     if(m_stream != nullptr) 
     { 
      m_client->Client->Shutdown(SocketShutdown::Both); // Stop sending/receiving 
      m_client->Client->Disconnect(true); // Disconnect the underlying network stream 
      m_client->Client->Close(); // Disconnect the underlying network stream 
      m_client->Close(); 
      delete m_client; 
      m_client = nullptr; 
     } 

     m_client = m_server->AcceptTcpClient(); //grab the TCP client 
     m_stream = m_client->GetStream(); //create the stream at the same time 
    } 

    // ...go and service pending messages on the client stream 
} 

The docs on the Disconnect() function 내가 설정할 수있는 제한 시간이있어 제안하지만 그들은 방법을 언급하지?

먼저 종료를 호출하지 않고 연결 끊기를 호출해야하는 경우 DontLinger 소켓 옵션을 false로 설정하고 나가는 전송을 위해 대기중인 데이터가 전송되도록 0이 아닌 시간 제한 간격을 지정할 수 있습니다. 연결이 끊어지면 데이터가 전송되거나 지정된 제한 시간이 만료 될 때까지 차단됩니다. DontLinger를 false로 설정하고 시간 초과 간격을 0으로 지정하면 Close는 연결을 해제하고 대기중인 대기 데이터를 자동으로 삭제합니다.

[편집]

나는 m_client->Client->Disconnect(false);- m_client->Client->Disconnect(true);을 변경하여 시간 제한 문제에 대한 해결책을 발견하지만 여전히 소켓이 닫힌 것을 내 고객을 경고하지 않습니다. 내가 테스트하는 생각할 수있는 모든 노력을했지만 그들은 모두 성공 :

// m_client is a TcpClient^ 
bool stillConnected = ((m_client != nullptr) && 
         (m_client->Connected == true) && 
         (m_client->Client != nullptr) && 
         (m_client->Client->Connected == true)); 

stillConnected 다른 클라이언트가 서버에 연결되어 있고, 따라서 위의 모든 종료 비트와 조각이라는 후에도 항상 true입니다. 그것은 내 질문 맨 위에 언급 된 종료 물건처럼 소켓을 제대로 닫지 않는 것과 같습니까?

+0

그건 C++/CLI입니까? 그렇지 않습니까? – abatishchev

+0

그렇습니다.하지만 문제는 .net/windows 네트워킹과 관련이 있습니다. 기본 하드웨어와 상호 작용하는 데 사용하는 언어가 아닌가요? –

답변

1

읽기 성공 및 0 바이트 길이가 반환되면 TCP 소켓 (원격 끝에서 FIN 플래그가 전송 됨)의 연결이 감지됩니다.

+0

당신의 제안은 나를 올바른 길로 인도합니다; 드롭을 감지하기 위해 읽기 작업을 수행해야했습니다. –

관련 문제