Q&A

  • SetSockOpt이라는 API를 사용하고 싶은데요...
델파이에서 기본적으로 선언되어 있지 않은 API인가 봅니다..

어떻게 해야 사용할 수 있는지..

고수님들 부탁드립니다..

2  COMMENTS
  • Profile
    구창민 2000.07.28 13:06
    장식원 wrote:

    > 델파이에서 기본적으로 선언되어 있지 않은 API인가 봅니다..

    > 어떻게 해야 사용할 수 있는지..

    > 고수님들 부탁드립니다..



    uses WinSock;



    //선언부..

    function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;

    optlen: Integer): Integer; stdcall;



    //사용예

    아래는 영대님이 예전에 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;





    즐거운 프로그래밍 하시길~

  • Profile
    장식원 2000.07.29 00:40
    답변해 주셔서 감사합니다.

    그런데 초보가 이해하기에는 너무 어려운 소스군요...

    제 나름대로 수정하기에는 제 실력이 너무 모자랍니다..

    번거로우시겠지만 좀 자세히 설명해 주실 수는 없으신지요...

    부탁 드리겠습니다.



    구창민 wrote:

    > 장식원 wrote:

    > > 델파이에서 기본적으로 선언되어 있지 않은 API인가 봅니다..

    > > 어떻게 해야 사용할 수 있는지..

    > > 고수님들 부탁드립니다..

    >

    > uses WinSock;

    >

    > //선언부..

    > function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;

    > optlen: Integer): Integer; stdcall;

    >

    > //사용예

    > 아래는 영대님이 예전에 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;

    >

    >

    > 즐거운 프로그래밍 하시길~