2017-04-24 4 views
0

끊은 경우 검색하는 방법 : 나는 소켓 제대로 모든 것을 연결C 소켓 프로그래밍 : 클라이언트가 두 개의 소스 파일이 나는 간단한 C 프로그램을하고 있어요

server.c 및 client.c을하고, 나는 poll() 함수를 사용하여 키보드 (파이프에 연결된 셸뿐만 아니라)에 대해 키보드를 폴링합니다.

클라이언트가^D 및^C 명령을 사용하여 자식 프로세스를 종료하고 클라이언트와 서버 터미널을 모두 종료 할 때를 감지 할 수 있습니다.

그러나 클라이언트가 전화를 끊으면 (즉 클라이언트 단말 탭에서 x를 명시 적으로 클릭) 감지 할 수 있습니까? 지금 당장 서버 탭에서이를 감지하지 못하고 닫히지 않습니다. 시간 제한 사용을 피하고 싶습니다.

+0

을하는 데 도움이, unsignaled 클라이언트/서버의 죽음을 감지 할 수 없습니다. 피어가 방금 죽거나, TCP 클로즈 교환이나 KEEPALIVE 또는 애플리케이션 레벨 폴링을 사용하는 것과 같은 데이터 교환 시도없이 도달 할 수없는 경우 상대방은 결코 알 수 없습니다. – ThingyWotsit

답변

0

대학의 컴퓨터 네트워크 클래스에서 이와 같은 과제를 수행했습니다. 내가 생각해 낸 해결책은 recv() sys 호출을 사용하여 클라이언트 소켓을 지속적으로 검사하는 것이 었습니다. 클라이언트가 더 이상 아무것도 보내지 않거나 연결을 끊지 않을 때 0을 반환하도록 설계되었습니다. 당신이 일반 TCP를 사용하는 경우

while (1) { 

    //Get request from client, leave if client quits 
    if (recv(client_socket, client_request, sizeof(client_request), 0) == 0) { 
    break; 
    } 
} 

또는

// This while condition will fail when recv returns 0, because C 
while (recv(client_socket, client_request, sizeof(client_request), 0)) { 
// insert code here 
} 

희망이

+0

'클라이언트가 더 이상 아무것도 보내지 않을 때 0을 반환하도록 설계되었습니다'- 아니요. – ThingyWotsit