Q&A

  • close 말고 shutdown 은 없나요?
통신프로그램을 종료시에 close를 쓰니까 close-wait 이나 pin-wait 이 걸리던데

통신종료시에 close 말고 다른 명령어는 없나요?



1  COMMENTS
  • Profile
    김영대 2000.02.17 20:09
    오정섭 wrote:

    > 통신프로그램을 종료시에 close를 쓰니까 close-wait 이나 pin-wait 이 걸리던데

    > 통신종료시에 close 말고 다른 명령어는 없나요?



    TCP/IP socket 프로그래밍을 말씀하시는 것이라면 아래는

    socket 핸들의 blocking 없이 강제로 종료하는 루틴입니다





    {parameter로 지정한 소켓을 강제로 즉시 닫는다(블록킹 해제됨)}

    procedure TMainForm.DOclosesocket(var socket_id: TSocket);

    var

    lingerinfo : Tlinger;

    begin

    // 블록킹(blocking)된 소켓함수가 있다면 이를 취소시킨다

    // 어느 경우에나 WSACancelBlockingCall() 이 호출되면 Block이 진행 중이던

    // 원래의 함수는 에러로 리턴하고, 이 때 에러 코드는 WSAEINTR이 된다

    // 이식성이 높은 응용 프로그램을 개발하기 위하여 WSACancelBlockingCall() 후에

    // closesocket() 이외의 다른 소켓 함수 호출은 하지 않는 것이 좋다.

    if socket_id <> INVALID_SOCKET then

    if WSAISBlocking then // 어떤 소켓 함수가 Block 상태에 있는 가를 검사

    begin

    WSACancelBlockingCall;

    DOAddLine(HOST_M+'Cancelled blocking call');

    end;



    lingerinfo.l_onoff := 1; {소켓을 강제로 즉시 종료}

    lingerinfo.l_linger := 0; {시간지연 없음}

    // setsockopt() 는 지정된 소켓의 형태, 상태와 관계 없이 소켓 옵션을 소켓에

    // 지정한다

    SetSockopt(socket_id, SOL_SOCKET, SO_LINGER, Pchar(@lingerinfo), sizeof(lingerinfo));



    CloseSocket(socket_id);

    socket_id := INVALID_SOCKET;

    end;