2009년 11월 2일 월요일

ioctlsocket

ioctlsocket

ioctlsocket 함수는 소켓의 입출력 모드를 제어하는 함수입니다.

int ioctlsocket (
        SOCKET  
s,
        long  
cmd,
        u_long FAR*  
argp
);

 

Parameters

s
[입력] 작업대상 소켓의 기술자(descriptor)를 명시합니다.

cmd
[입력] 소켓 s가 수행할 컴맨드(command)

argp
[입/출력] command에 대한 입/출력 파라메터로 사용됩니다.

Remarks

ioctlsocket 함수는 특정한 상태로 지정한 소켓을 제어하는데 사용됩니다. 이 함수는 소켓과 연관된 매개변수를 반환하거나, 설정 할 수 있습니다. 아래에 cmd 매개변수와 사용방법에 대해서 지원되는 컴맨드를 나열해 보았습니다. 참고하세요.

    FIONBIO

    argp 매개변수가 0이 아닐 경우 소켓 s의 넌블럭킹(비동기) 모드를 활성화 합니다. argp 매개변수가 0일 경우는 넌블럭킹(비동기) 모드는 비활성화 됩니다. argp 매개변수는 unsigned long 값을 포인트 합니다. 소켓이 생성되었을 때는 기본적으로 블록킹(동기) 모드로 동작한다는 사실을 참고로 알아둡시다.

    WSAAsyncSelect 그리고 WSAEventSelect 함수는 소켓을 넌블럭킹(비동기) 모드로 설정합니다. 만약 WSAAsyncSelect 함수나 WSAEventSelect 함수가 소켓에 대해서 설정 되었다면, ioctlsocket 함수를 호출하여 블록킹(동기) 모드로 소켓을 설정하려고 하는 시도는 WSAEINVAL 에러코드를 동반(?)한 실패로 돌아갈 것입니다. 소켓을 블록킹 모드로 설정하기 위해서 어플리케이션은 IEvent 매개변수를 0으로 해서 WSAAsyncSelect 함수를 호출하거나 INetworkEvents 매개변수를 0으로 하여 WSAEventSelect 함수를 호출해야만 합니다.

    FIONREAD

    네트웍 입력 버퍼에서 기다리고 있는, 소켓 s로부터 읽을 수 있는 데이터의 크기(amount)를 얻어내는데 사용됩니다. argp 매개변수는 데이터의 크기를 의미하는 unsigned long 형태로 포인트 합니다. 다시 말하자면, 만약 s 매개변수가 연결지향형(stream oriented) 소켓(예:SOCK_STREAM) 일 경우 FIONREAD 컴맨드에 의한 ioctlsocket 함수의 호출은 recv 함수의 호출로 읽을 수 있는 데이터의 크기(amount)를 반환하게 되는거죠. 만약 소켓이 메시지 지향형(message oriented) 소켓(예:SOCK_DGRAM) 일 경우 FIONREAD 컴맨드는 소켓에 큐된 첫 번째 데이터그램의 크기를 반환 합니다.

    SIOCATMARK

    소켓으로부터 out-of-band 데이터가 모두 읽혀졌는지를 판단하기 위해 사용됩니다. argp 파라메터는 반환값이 저장된 boolean 로 포인트 합니다. 읽혀지기를 원하는 out-of-band 데이터가 없을 경우 TRUE가 반환되고, 그렇지 않은 경우 FALSE가 반환 됩니다. 이 명령은 setsockopt 함수로 SO_OOBINLINE 옵션을 설정한 SOCK_STREAM 타입의 스트림 소켓에만 적용될 수 있습니다.

Compatibility

ioctlsocket 함수는 버클리 소켓의 ioctl 함수와 비교해 볼 때 극히 일부분에 대해서만 동작 합니다. ioctlsocket 함수는 ioctl 함수의 FIOASYNC와 같은 컴맨트 매개변수를 지원하지 않습니다. 그리고, SIOCATMARK 컴맨드는 ioctrlsocket 함수에서만 제공되는 컴맨드 입니다.

Return Values

성공적으로 함수가 수행하면, ioctlsocket 함수는 0을 반환 합니다. 에러가 발생한 경우는 SOCK_ERROR을 반환하고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.

WSAENETDOWN 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEINPROGRESS

블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를

여전히 처리하고 있습니다.

WSAENOTSOCK

기술자(descriptor)가 소켓 기술자가 아닙니다.

WSAEFAULT argp 매개변수가 올바를 형태가 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 버젼 1.0 그리고 그이후의 버젼에서 사용가능
Header :
          Win16/32 : winsock.h
          Win32-II : winsock2.h
Import Library :
          Win16 : winsock.lib
          Win32 : wsock32.lib
          Win32-II : ws2_32.lib

See Also

댓글 없음:

댓글 쓰기