2015-01-19 2 views
2

클라이언트로부터의 연결을 받아서 소켓에 쓰는 작은 서버 쪽 프로그램이 있습니다. 클라이언트가 연결 해제되자 마자 서버 측에서 감지하고 싶습니다. 연결이 끊어 졌을 때 클라이언트가 TCP Fin을 보내고 서버가 클라이언트쪽으로 보낼 데이터가있는 경우에만 서버가이를 감지하고 파손 된 파이프 예외가 발생하는 것을 봅니다. 대신 서버가 클라이언트가 Finish를 보낸 것을 감지하고 즉시 세션을 닫을 수있게하려고합니다. 누군가가 약간의 정보를 제공함으로써 나를 도울 수 있습니까? 연결을 허용하는파이썬 소켓 : 클라이언트가 서버 쪽에서 닫히거나 연결이 끊어 졌음을 감지하는 방법

>>> Error sending data: [Errno 32] Broken pipe 
[DEBUG] (Keepalive-Thread) Exiting 

서버 프로그램 : 그것은 클라이언트쪽으로 보낼 수있는 일부 데이터를 가지고 있는데이 깨진 파이프 예외를 참조하는 경우에만

def enable_pce(ip): 
    #Step 1: Create a TCP/IP socket to listen on. This listens for IPv4 AFI 
    srv = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

    #Step 2: Prevent from "address in use" upon server restart 
    srv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 

    #Step 3: Bind the socket to you server ip address 

    srv_address = (ip,55555) 
    print 'starting server on %s port %s' % srv_address 
    srv.bind(srv_address) 

    #Step 4: Listen for connections 
    srv.listen(1) 

    #Step 5: Wait for incoming connections 

    connection, peer_address = peer.accept() 
    print 'connection from', connection.getpeername() 
    return connection 

답변

3

서버는 감지된다.

소켓에 연결 (깨진 파이프)을 쓸 때 오류가 발생하거나 소켓에서 읽고 아무 ​​것도 얻지 않고 (오류가없고 데이터가 없음) 피어가 연결을 끊을 수 있습니다.

대부분의 시나리오에서 피어 (예 : 읽기 또는 쓰기)와 통신하려는 경우 단절을 감지하는 것만 중요합니다. 실제로 데이터를 읽거나 쓰지 않고이 작업을 수행하려면 select.select으로 소켓의 가독성을 확인하고 소켓이 recvMSG_PEEK 인 읽기 버퍼를 읽을 수 있는지 확인하십시오.

관련 문제