accept

accept 함수는 소켓(리슨소켓)으로 들어오는 접속요청을 허용하는 함수입니다.

SOCKET accept (
SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen
);

Parameters

s
[입력] listen 함수에 의해서 접속대기 하고 있는 소켓(일반적으로 리슨소켓 이라고 하죠.) 의 기술자(descriptor) 입니다.

addr
[출력] 연결의 다른 쪽 끝에 있는 원격 호스트의 어드레스를 포인트 합니다.

addrlen
[출력] addr 매개변수에 의해 포인트된 버퍼의 길이를 나타내는 정수를 포인트 합니다.

Remarks

리슨소켓에 도착한 연결요청은 접속대기 큐에 쌓여집니다. accept 함수는 접속대기 큐에 있는 첫 번째 접속을 뽑아냅니다. 그런다음 새로운 소켓을 생성하고, 새로운 소켓의 핸들을 반환합니다. 새로 생성된 소켓은 같이 연결된소켓(WSAAsyncSelect 나 WSAEventSelect 함수로 비동기적인 이벤트가 등록된 소켓임)과 실제적으로 접속이 된 소켓핸들입니다. accept 함수로 접속요청을 이루어 내게 되면, 이 새로운 소켓은 리슨 소켓의 그룹 아이디를 가지지 않게 됩니다.

accept 함수는 만약 큐에 접속을 기다리는(pending connections) 항목이 없고, 소켓이 블록킹(동기) 소켓으로 마킹되어 있다면, 접속할 때까지 caller를 블록킹 상태가 되게 할 수 있습니다. 만약 소켓이 넌블록킹(비동기) 소켓으로 되어 있고, 큐에 대해 기다리는 접속(pending connections)이 없다면, accept 함수는 에러를 반환 합니다. accept는 성공적인 수행후에 새로운 소켓핸들을 반환합니다. 접속이 허용된 새로운 소켓은 접속요청한 소켓과 실제적으로 연결이 된 소켓이지 달리 생성되는 리슨소켓이 아닙니다. 원래 리슨 소켓은 다시 다른 접속요구를 개방하고, 리슨 하기위해 남겨집니다.

addr 매개변수는 접속주소로 채워진 결과를 담고 있습니다. addr 매개변수의 포맷은 통신이 발생한 주소 패밀리를 결정합니다. addrlen 매개변수는 addr에 의해 포인트된 버퍼의 길이를 나타내는 정수(바이트)로 포인트 합니다.

accept 함수는 SOCK_STREAM 과 같은 연결지향형 소켓 타입에 사용됩니다.

만약 addr이나 addrlen 매개변수가 NULL 이라면, 접속된 소켓의 원격지 주소에대한 정보를 반환하지 않습니다.

Windows CE : Windows CE 에서는 WSAEINTR 에러 코드를 지원하지 않습니다.

IrSocket을 구현 할 때는 addr, addrlen 매개변수는 항상 NULL 이여야 합니다.

Return Values

에러가 발생하지 않는다면, 새로운 소켓의 기술자(descriptor)를 가지고 있는 SOCKET(u_int) 형태의 값을 리턴합니다. 이 리턴값은 실제적으로 원격지와 연결되어 있는 소켓의 핸들입니다.

에러가 발생한 경우 INVALID_SOCKET 이라는 값이 리턴되고, 특정한 에러코드는 WSAGetLastError 함수에 의해 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | addrlen 매개변수가 너무 작거나, addr 매개변수가 올바르지 않습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | accept 하기 전에 listen 함수가 불려지지 않았습니다.
WSAEMFILE | 새로운 소켓에 할당하기 위한 소켓 기술자가 더 이상 남아있지 않습니다.
WSAENOBUFS | 사용할 수 있는 버퍼 공간이 남아있지 않습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | socket이 연결지향형 서비스(SOCK_STREAM)형태가 아닙니다.
WSAEWOULDBLOCK | socket이 비동기 적으로 마킹되어 있고, 접속이 허용되지 않았습니다.

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

overview, bind , connect , listen , select , socket , WSAAsyncSelect , WSAAccept


bind

bind 함수는 로컬 인터페이스 어드레스와 포트번호를 소켓과 서로 연관되게 묶는 함수입니다.

int bind (
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);

Parameters

s
[입력] 로컬어드레스와 아직 묶여지지 않은 소켓 기술자(descriptor).

name
[입력] 소켓에 할당하기위한 SOCKADDR 구조체로 이루어진 주소.

namelen
[입력] name 매개변수의 크기 (일반적으로 sizeof(SOCKADDR) 요로케 쓰입니다).

Remarks

처음 만들어 질 때 소켓은 그와 관련된 로컬 어드레스를 가지지 않습니다. 따라서 bind 함수는 connect 나 listen 함수를 뒤이어 호출하기 전에, 접속되지 않은 소켓에 사용됩니다. 이 함수는 접속지향형소켓(stream socket : TCP)이나 비접속(datagram : UDP) 소켓 이나 모두 사용합니다. 소켓이 socket 함수를 호출해서 생성될 때, 소켓은 이름공간(name space)에 존재합니다. 하지만, 할당된 이름을 가지지는 않습니다. 그러므로, 이름 지여지지 않은 소켓과 로컬 어드레스를 연결지우기 위해서 이 함수는 사용됩니다.

이 함수에 의해서 할당되어 지는 이름은 세가지 부분으로 구성됩니다. (인터넷 주소 체계를 사용할 때 : 주소체계(address family), 호스트주소(host address), 어플리케이션에 사용되는 포트번호(port number)) WinSock2 에서는 name 매개변수는 SOCKADDR 구조체의 포인터로 반드시 넘겨야 한다라는 그런 규정은 없습니다. 그저 윈도우즈 소켓 1.1 과의 호환성 때문에 남았는 산물정도라고 생각해 두세요. 서비스 프로바이더는 namelen 의 메모리 사이즈 블록 포인터에 대해 연관을 받지 않습니다. 메모리 블록에서 첫번째 2Byte (SOCKADDR 구조체의 sa_family에 해당되는 부분입니다) 는 소켓을 생성하는데 사용되는 어드레스 체계(address family)를 가지고 있어야 합니다. 그렇지 않다면, WSAEFAULT 에러가 발생 할 것입니다.

만약 어플리케이션이 어떤 로컬 어드레스를 할당 할 것인지 고려하지 않고 사용된다면, name 매개변수의 sa_data 멤버를 위해 INADDR_ANY 라는 상수값을 명시해야 합니다. 이 상수값을 사용하면, 적절한 네트웍 주소를 사용하기 위해 기본이되는 서비스 프로바이더를 적용하게 됩니다. 이 상수값은 한 개 이상의 네트웍 인터페이스나 주소가 있는 호스트일 경우 어플리케이션 프로그래밍을 간략히 하기 위해서 사용됩니다. 대부분의 프로그램은 인터페이스 어드레스에 대해 INADDR_ANY를 사용합니다.

TCP/IP에서 포트번호가 0으로 명시된 경우에는 서비스 프로바이더가 어플리케이션을 위한 고유한 포트번호(1024~5000 사이의 값)를 할당합니다. 어플리케이션은 주소와 포트를 알기위해 bind 된 후에 getsockname 함수를 사용할 수 있습니다. 만약 인터넷 주소가 INADDR_ANY 로 사용되어 있다면, getsockname 함수는 접속되기 전까지는 사용하지 못합니다. (몇몇 주소들은 호스트가 multihome 일 경우 올바를 수도 있기 때문입니다) 0번 포트가 아닌 특정한 포트 번호를 바인딩하는 것은 클라이언트 어플리케이션을 무용지물이 되게 합니다. 왜냐하면, 다른 소켓에 이미 그 포트 번호를 사용하고 있을 경우 충돌 할 수 있는 위험이 있기 때문입니다. 따라서, 클라이언트 프로그램이 포트 0을 지정하는 반면, 서버 프로그램은 대개 자신의 포트 번호를 지정합니다.

connect 함수를 호출하기 전에는 bind 함수와 같이 소켓과 어드레스를 묶는 함수가 사실상 필요치 않습니다. 소켓이 묶이기 전에 connect 함수가 호출될 경우 bind 함수가 INADDR_ANY 의 어드레스와 포트 번호 0을 이용하여 소켓에 대해 호출된 것처럼 소켓은 자동으로 묶이게 됩니다. 대부분의 클라이언트 어플리케이션은 로컬 인터페이스 어드레스나 특별한 포트 값을 지정할 필요가 없습니다. 따라서 bind함수를 호출하기 전에 connect 함수를 호출함으로써 이들 어플리케이션에 대한 단계를 줄일 수 있습니다. 일반적으로 서버 어플리케이션은 Well-known 포트와 묶인 소켓을 생성해야 합니다. 이를 위해 bind 함수는 대부분 서버에 대해 명확하게 호출되어야 합니다.

Windows CE : IrSocket 에서의 구현...

  • Af_irda.h를 포함 시켜주어야 합니다.
  • SOCKADDR_IRDA_wcesdk_SOCKADDR_IRDA 구조체가 addr 매개변수로 사용됩니다.
  • WSAENETDOWN 에러코드는 지원되지 않습니다.
  • INADDR_ANY와 같은 와일드 카드 주소는 지원되지 않습니다.

    • IrSocket 클라이언트는 connect 함수를 사용하기 전에 bind 함수를 호출해야 합니다. 만약 서비스 이름이 "LSAP-SELxxx"형태(xxx는 0~255사이의 십진 정수) 라면, 주소는 서비스 이름 보다 특정한 LSAP-SEL xxx를 의미합니다. LSAP-SELxxx 서비스 이름은 IAS를 발생하지 않을 것입니다. 소켓은 특정한 IAS를 무시한 LSAP-SEL을 직접적으로 묶을것입니다.

Return Values

에러가 없는 경우 0을 리턴합니다. 에러가 발생한 경우는 SOCKET_ERROR을 리턴합니다. 그리고, WSAGetLastError 함수를 호출해서 특정한 에러코드를 리턴 할 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEADDRINUSE | 프로세스가 이미 같은 어드레스로 바운드 되어있고, 소켓이 SO_REUSEADDR로 재 사용 어드레스라는 항목을 마크 하지 않았습니다. 한 예로, IP 주소와 포트가 af_inet 경우로 바운드 되어있는 경우입니다. (setsockopt 함수에 의한 SO_REUSEADDR 소켓 옵션에 대해서 참고하세요)
WSAEADDRNOTAVAIL | 지정된 주소가 정확한 주소가 아닙니다.
WSAEFAULT | name이나 namelen 매개변수가 올바르지 않습니다. namelen 매개변수가 너무 작거나, name 매개변수가 연관된 주소체계에 대해서 잘못된 주소 형태를 포함하고 있습니다. 또는, 메모리 블록의 첫 번째 2Byte 가 소켓 기술자 s와 연관된 주소체계와 일치하지 않습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | 소켓이 이미 특정주소와 바인드 되어 있습니다.
WSAENOBUFS | 너무 많은 접속으로 인하여 버퍼가 충분하지 않습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.

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

overview, connect, getsockname, listen, setsockopt, socket, WSACancelBlockingCall


closesocket

closesocket 함수는 윈도우즈 소켓 시스템에 할당된 socket과 관련된 리소스를 해제 하는 함수입니다.

int closesocket (
SOCKET s
);

Parameters

s
[입력] 닫을 소켓의 기술자(descriptor)

Remarks

프로그램이 소켓을 더 이상 사용하지 않을 경우 closesocket 함수를 호출하여 소켓 기술자와 관련된 자원을 반납 할 수 있습니다. closesocket 함수가 반환된 후에 소켓 기술자는 더 이상 유효하지 않게 됩니다. 즉, 닫혀진 소켓 기술자에 대해 소켓 함수가 호출될 경우 에러가 발생 할 것입니다.

비동기적으로 전송/수신 연산을 하는 함수 (오버랩 소켓에 사용되는 WSASend/WSASendTo/WSARecv/WSARecvFrom)들은 closesocket 함수에 의해서 취소됩니다. 이러한 오버랩 연산을 하는 것들은 WSA_OPERATION_ABORTED 라는 에러상태로 실패하게 되는 거죠.

어플리케이션에서 socket 함수로 윈도우즈 소켓을 얻었다면, 반드시 closesocket 함수를 호출 해서 할당 되었던 소켓 리소스를 반환 해야 합니다.

closesocket 함수의 체계(함수가 바로 리턴되는냐 마느냐)는 SO_LINGER 과, SO_DONTLINGER 와 같은 소켓 옵션에 의해서 영향을 받습니다. 아래의 표는 이러한 것들을 요약한 것입니다. 소켓 옵션에 대해 더 자세히 알고 싶으면, getsockopt 부분과 setsockopt 부분을 참고 하시면 됩니다.

옵션 | 타임아웃간격 | 닫힘유형 | 닫힘대기
SO_DONTLINGER | 상관없음(이론상) | 우아(graceful)한 닫힘 | 대기하지 않음
SO_LINGER | 0 | 경직된(Hard) 닫힘 | 대기하지 않음
SO_LINGER | 0 이아님 | 우아(graceful)한 닫힘 | 대기 함

만약 SO_LINGER 가 타임아웃 간격을 0으로 셋팅한다면 (즉, LINGER 구조체의 l_onoff 멤버가 0이 아니고, l_linger 가 0인경우), closesocket 함수는 아직 보내지지 않은 데이터가 큐에 남아있더라도 블록킹 상태로 빠지지 않습니다. 이러한 것은 "경직된(hard)" 또는 "중단된(abortive)" 닫힘(close) 라고 합니다. 이러한 경우 소켓의 가상 회로망이 즉시 리셋 되므로 전송되지 않은 데이터는 손실되게 됩니다. 연결의 원격 종단에서 recv 함수가 시도될 경우 WSAECONNRESET 에러를 반환합니다.

만약 SO_LINGER 가 블록킹(동기) 소켓에서 타임아웃 간격을 0 이 아닌 값으로 셋팅한다면, closesocket 함수는 타임아웃 되는시간동안 남아있는 데이터를 보낼 때 까지 소켓은 블록킹 상태가 됩니다. 이러한 호출을 우아한 단절(graceful disconnect) 이라고 합니다. 만약 모든 데이터를 보내기 전에 타임아웃 시간을 모두다 소비한다면, 윈도우즈 소켓은 closesocket 함수가 리턴하기전에 접속을 종료하게 됩니다.

비동기(넌블럭킹) 소켓에서 0이 아닌 타임아웃 간격을 가진 SO_LINGER를 설정하는 것은 좋은 방식이 아닙니다. 이러한 경우에 closesocket 함수는 닫힘 연산이 즉시 완료될 수 없다면, 에러와 함께 WSAEWOULDBLOCK 에러코드를 발생할 것입니다. closesocket 함수가 WSAEWOULDBLOCK 에러코드를 내면서 실패할 경우 소켓 핸들은 여전히 올바를 핸들이되고 접속해제는 완벽하게 이루어지지 않습니다. 어플리케이션은 소켓을 닫기위해서 다시 closesocket을 호출해야만 합니다. 만약 SO_DONTLINGER 가 LINGER 구조체의 멤버중 l_onoff 멤버를 0으로 셋팅하여 스트림 소켓에 셋팅 되었다면, 함수는 바로 리턴되고, 소켓이 블록킹 이건 아니건 간에 WSAEWOULDBLOCK 에러코드를 발생하지 않습니다. 하지만, 기본적이 소켓이 닫히기 전에 전송을 위해서 큐에 저장된 데이터는 보내졌을 것입니다.(참~ 무책임한 말이져 ㅠㅠ) 이러한 방식 또한 우아한 단절(graceful disconnect)이라고 합니다. 이러한 방식은 가장 기본적인 동작이죠, SO_DONTLINGER 는 기본치로 셋팅 되어 있습니다.

Note : 접속상태에서 데이터가 보내졌는지 수신되었는지 확인 하려면, 어플리케이션은 closesocket함수를 호출하기전에 shutdown 함수를 호출해야 합니다. (더많은 정보를 얻고자 한다면, Graceful shutdown, linger option and socket closure 요기를 참고하세요)

closesocket 함수의 동작에 대해서 요약 해 보았습니다.

  • SO_DONTLINGER 가 사용될 경우 (디폴트로 사용된다는거 아시져?) 함수는 항상 바로 리턴 됩니다. - 접속은 우아한 닫임(gracefully closed) 으로 종료됩니다.
  • SO_LINGER 가 타임아웃을 0 으로 하여 사용될 경우 함수는 항상 바로 리턴 됩니다. - 접속은 리셋/종료 됩니다.
  • SO_LINGER 가 타임아웃을 0 이 아닌 값으로 하여 사용될 경우...

    - 블록킹(동기) 소켓에서 타임아웃 시간동안 큐에 남아있는 데이터를 보낼 때 까지 블록킹 상태가 됩니다.

    - 넌블록킹(비동기) 소켓에서 실패라는 신호와 함께 바로 리턴합니다.

Windows CE: Windows CE 프로그래밍 에서는 WSAEINTR 에러코드를 지원되지 않습니다.

IrSocket 에서의 구현:

  • Af_irda.h 파일을 include 해야 합니다.
  • WSAENETDOWN 에러코드는 지원되지 않습니다.
  • 표준 linger 옵션은 지원됩니다.

    • IrDA 는 우아한 닫힘(graceful close)를 제공하지 않음에도 불구하고, IrSocket은 큐가 다 청소될 때 까지 소켓의 닫힘을 미룹니다. 따라서 어플리케이션에서는 데이터를 전송할 수 있고, FD_CLOSE 메시지를 수신받기 전까지 바로 소켓 함수를 호출 할 수 있습니다.

Return Values

에러가 없을 경우 closesocket 함수는 0을 리턴합니다. 에러가 발생 했을 경우 SOCKET_ERROR 에러코드를 리턴합니다. 그리고 WSAGetLastError 함수를 호출해서 특정한 에러코드를 받을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEWOULDBLOCK | 비동기 소켓이고, SO_LINGER 가 0이 아닌 타임아웃 간격으로 셋팅되어 있는 경우

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

overview, accept , ioctlsocket, setsockopt, socket, WSAAsyncSelect, WSADuplicateSocket


제목없음

connect

connect 함수는 지정된 소켓을 지정된 원격지로 접속을 이루는 함수입니다.

int connect (
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);

Parameters

s
[입력] 접속되지 않은 소켓을 식별하는 기술자(descriptor).

name
[입력] 어디로 접속할 것인지에 대한 정보를 담은 SOCKADDR 구조체

namelen
[입력] name 매개변수의 크기

Remarks

connect 함수는 명시된 목적 호스트로의 접속을 이루는데 사용되는 함수입니다. 만약 SOCKET s 매개변수가 bind되지 않은 상태라면, 윈도우즈 소켓 시스템은 인터페이스 어드레스와 포트번호를 소켓에 묶을(bind) 것입니다. 이는 bind 함수가 인터페이스 어드레스와 포트번호를 각각 INADDR_ANY 와 0 으로 지정하여 소켓에서 호출된 것과 유사합니다.

접속 지향형 소켓(connection-oriented sockets : SOCK_STREAM)의 경우 접속은 name (SOCKADDR 구조체를 참고하세요.) 매개변수에 지정된 다른 호스트로 실제적인 연결이 설정됩니다.. 소켓이 이 함수를 성공적으로 호출했을때 소켓은 데이터를 전송하고 수신할 준비가 되어있게 됩니다. 만약 지정된 name 매개변수의 구조체의 주소 멤버가 모두 0 으로 셋팅되어 있다면, connect 함수는 WSAEADDRNOTAVAIL 이라는 에러를 리턴할 것입니다. 이미 운용중인 접속된 소켓을 다시 접속하려 할 때는 WSAEISCONN 에러 코드를 발생하며, 접속에 실패하게 됩니다.

접속 지향형인 비동기 소켓(connection-oriented nonblocking sockets)의 경우 종종 바로 접속이 이루어 지지 않습니다. 이런경우에 connect 함수는 WSAEWOULDBLOCK 에러코드를 발생하게 됩니다. 하지만, 접속하는 과정은 계속 수행되므로 이런 상황을 두고 접속에러 라고 볼수는 없습니다. connect 에 대한 성공 또는 실패의 결과를 알게 되었을때, 소켓은 어떤방법으로 통지메세지를 받을 것인가에 대해 보고됩니다. 만약 클라이언트가 select 함수를 사용했다면, 성공은 writefds set 이라고 알려지며, 실패 했을경우는 exceptfds set 이라고 알려집니다. 만약 클라이언트가 WSAAsyncSelect 함수나 WSAEventSelect 함수를 사용했다면, 접속에 대한 통지메세지는 FD_CONNECT 로 알려집니다. 그리고, FD_CONNECT 와 관련된 에러코드는 성공했거나 특별한 이유로 실패 했건간에 발생합니다.

비접속 지향형 소켓(connectionless socket : SOCK_DGRAM)의 경우 connect 함수에 의해서 수행되는 연산은 단지 나중에 사용될 send/WSASend, recv/WSARecv 함수에 대한 기본 목적 주소를 확립 하기위해 사용됩니다. name 매개변수중에 주소부분이 모두 0으로 설정되어 있다면, 소켓은 "dis-connected" 될 것입니다. 따라서 기본 원격지 주소가 결정되지 않았으므로 이런 경우에 send/WSASend, recv/WSARecv 함수를 사용하면, WSAENOTCONN 이라는 에러코드를 리턴할 것입니다. 하지만, 이런 경우엔 sendto/WSASendTo, recvfrom/WSARecvFrom 함수는 여전히 사용 가능 합니다. 기본 목적지 주소는 connect 함수를 다시한번 호출함으로써 간단히 바꿀 수 있습니다. 비접속 지향형 소켓인 경우엔 이전에 이미 접속된 상태 라고 할 지라도, 상관없습니다. 만약 새로 connect되는 name 이 이전에 접속된 정보와 다르다면, 수신하기 위해서 큐에 저장되었던 데이터그램 데이터는 없어져 버립니다.

비접속 지향형 소켓의 경우 name 매개변수는 브로드캐스트(broadcast) 주소를 포함한 올바른 주소를 나타낼수 있습니다. 하지만, 브로드캐스트 주소에 접속하기 위해서는 SO_BROADCAST 옵션을 체크하기위해 setsockopt 함수를 이용하여야 합니다. 그렇지 않으면, connect 함수는 WSAEACCES 에러코드를 내면서 실패 할 것입니다.

Windows CE: Windows CE 에서는 WSAEINTR 에러 코드를 지원하지 않습니다.

IrSocket에서의 구현 방법에 대해서:

  • Af_irda.h 헤더 파일을 include 해야 합니다.
  • WSAENETDOWN 에러코드가 리턴되면, 현재 IrDA 접속은 미디어 접근 레벨에서 보호됩니다.
  • WSAEADDRINUSE 에러코드가 리턴되면, 다른 주소를 가진 device로의 접속이 존재한다는 의미입니다.
  • WSAEINPROGRESS 에러코드가 리턴되면, 다른 IAS 요청이 진행중이기 때문에 IAS name resolution은 실패한다는 의미입니다.
  • WSAEISCONN 에러코드가 리턴되면, 소켓은 이미 접속되어 있거나 배타적/다중적 모드 변환이 실패 했다는 의미입니다.

IrSockets은 sockaddr_irda 형태의 주소로 connect 함수를 구현합니다. 일반적으로 클라이언트 어플리케이션은 socket 함수를 사용해서 socket을 생성하고, IRLMP_ENUMDEVICES 소켓 옵션으로 IrDa 디바이스에 대한 것들을 스캔하고, 반환되는 주소 형태의 리스트로부터 디바이스를 선택 할 것입니다. 그리고 connect 함수를 호출합니다. 동기소켓과 비동기 소켓과의 차이점은 없습니다.

Return Values

에러가 발생하지 않을 경우 connect 함수는 0을 리턴합니다. 에러가 발생한 경우 SOCKET_ERROR를 리턴하고 특정한 에러코드는 WSAGetLastError 함수를 호출 함으로써 얻을 수 있습니다.

동기소켓(blocking socket) 에서 리턴 값은 접속 시도의 성공 또는 실패 값을 의미합니다.

비동기 소켓(nonblocking socket) 에서 접속 시도는 바로 완료될 수 없습니다. 이런 경우에, connect 함수는SOCKET_ERROR 를 리턴 할 것입니다. 그리고 WSAGetLastError 함수는 WSAEWOULDBLOCK 에러코드를 리턴 할 것입니다. 이런경우에 접속처리의 완료를 알아내기 위해 우리가 취할 수 있는방법이 3가지가 있습니다.

  1. 접속 요청에 의한 완료를 결정하기위해서 select 함수를 사용합니다.
  2. 만약 어플리케이션이 접속 이벤트 발생을 위해 WSAAsyncSelect 함수를 사용 했다면, 어플리케이션은 접속처리가 완료(성공했든 실패했든) 되었다는 것을 의미하는 FD_CONNECT 통지 메세지를 받을 것입니다.
  3. 만약 어플리케이션이 접속 이벤트 발생을 위해 WSAEventSelect 함수를 사용 했다면, 엮어져 있는 이벤트 객체는 접속처리가 완료(성공했든 실패했든) 되었다는 것을 의미하는 신호를 받을 것입니다.

비동기 소켓(nonblocking socket)에서 접속 시도가 완료되지 전에, 같은 소켓에 대한 다음에 이어지는 connect 함수의 호출은 WSAEALREADY 에러 코드를 발생하는 실패로 돌아갈 것이고 접속이 성공적으로 완료 된 상태에서의 connect 함수의 호출은 WSAEISCONN 에러 코드를 발생하는 실패로 돌아갈 것입니다. 즉, 어플리케이션에서 이중으로 connect 함수를 호출하는것은 바람직 하지 않습니다. 하지만, 만약 에러코드가 접속 시도 실패와 같은 에러 코드를 의미한다면( 예를들어 WSAECONNREFUSED, WSAENETUNREACH 와 같이) 같은 소켓에 대해서 다시 connect 함수를 호출 할 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEADDRINUSE | 지정된 어드레스가 이미 사용중 입니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEALREADY | 비동기 connect 오퍼레이션 호출이 지정된 소켓에서 현재 진행 중입니다.
WSAEADDRNOTAVAIL | 원격 어드레스가 ADDR_ANY 와 같이 올바로된 어드레스가 아닙니다.
WSAEAFNOSUPPORT | 지정된 어드레스 체계가 윈속에서 사용할 수 없는 형태 입니다.
WSAECONNREFUSED | 접속시도가 강제로 종료되었습니다.
WSAEFAULT | name 또는 namelen 매개변수가 올바른 형태가 아닙니다.
WSAEINVAL | s 매개변수가 리슨소켓이거나, 지정된 목적지 주소가 일관적이지 않습니다.
WSAEISCONN | 접속지향형 소켓(SOCK_STREAM) 에서 소켓이 이미 연결되어 있습니다.
WSAENETUNREACH | 네트웍이 현재 지정된 호스트로 연결될 수 없습니다.
WSAENOBUFS | 남아있는 버퍼 공간이 없어서 소켓은 접속 할 수 없습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAETIMEDOUT | 접속 시도가 시간초과 되었습니다.
WSAEWOULDBLOCK | 소켓이 비동기 소켓으로 마킹되어 있을 경우 즉시 접속연산을 완료할 수 없을 때 수시로 나옵니다.
WSAEACCES | 브로드캐스트(broadcast) 어드레스를 위한 데이터그램 소켓의 접속시도가 setsockopt 함수로 SO_BROADCAST 가 설정되어있지 않은 상태에서 실패 했습니다.

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

overview, accept , bind, getsockname, select, socket, WSAAsyncSelect, WSAConnect


FD_SET

typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;

Element | Usage
fd_count | ¼³Á¤ÇÏ´Â ¼ÒÄÏÀÇ ¹øÈ£
fd_array | ¼³Á¤µÈ ¼ÒÄÏÀÇ ¹è¿


gethostbyaddr

gethostbyaddr 함수는 네트웍 어드레스에 대응되는 호스트 정보를 반환하는 함수입니다.

struct HOSTENT FAR * gethostbyaddr (
const char FAR * addr,
int len,
int type
);

Parameters

addr
[입력] 네트웍 바이트 오더의 어드레스 포인터 (주의:쩜 표기법의 스트링이 아닙니다.)

len
[입력] 어드레스의 길이를 지정 지정합니다. ( 32비트 IP 어드레스의 경우 항상 4 )

type
[입력] 어드레스의 형태 ( ex : PF_INET )

Remarks

gethostbyaddr 함수는 주어진 네트웍 어드레스와 대응되는 이름과 주소를 가진 HOSTENT 구조체의 포인터를 리턴합니다. 모든 스트링은 NULL로 끝나는 문자 입니다.

Return Values

아무런 에러가 발생되지 않았으면, HOSTENT 구조체의 포인터를 리턴합니다. 에러가 발생한경우에는 NULL 포인터를 리턴합니다. 그외 특별한 에러코드를 얻고자 할때는 WSAGetLastError 함수를 호출하여 에러사항을 검출해 낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 발견 할 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러가 발생했습니다.
WSANO_DATA | 요청한 형태의 데이터가 기록되지 않았습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEAFNOSUPPORT | 매개변수의 type이 윈속에서 지원되지 않는 형태입니다.
WSAEFAULT | addr 매개변수가 사용자 주소 공간에서 올바를 형태가 아니거나, len 매개변수가 너무 작습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, gethostbyname , HOSTENT , WSAAsyncGetHostByAddr


gethostbyname

gethostbyname 함수는 호스트 데이터베이스로 부터 호스트 이름에 대응되는 호스트 정보를 얻어내는 함수이다.

struct HOSTENT FAR * gethostbyname (
const char FAR * name
);

Parameters

name
[입력] NULL로 끝나는 호스트 이름

Remarks

gethostbyaddr 함수와 같이 gethostbyname 함수는 리턴값으로 HOSTENT 구조체에 대한 포인터나 NULL을 반환 합니다. 구조체는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

Return Values

아무런 에러가 발생하지 않는다면, gethostbyname 함수는 HOSTENT 구조체의 포인터를 리턴할 겁니다. 에러가 발생한 경우에는 NULL 포인터를 반환 할 것이며, WSAGetLastError 함수를 호출 함으로써 더욱 자세한 에러코드를 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기전에 성공적인 WSAStartup 함수의 호출이 이루어져야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 찾을 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러가 발생 했습니다.
WSANO_DATA | 요청한 형태의 데이터가 기록되지 않았습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEFAULT | name 매개변수가 user address space의 올바를 형태가 아닙니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, gethostbyaddr , WSAAsyncGetHostByName

Sample

아래의 사용예제는 로컬 호스트의 IP Address를 쩜~표기법으로 이루어지는 스트링으로 얻어내는 방법을 보여주는 예제입니다. 버클리 소켓의 경우 로컬 호스트의 아이피 어드레스를 얻어내는 gethostaddr 함수는 지원되는 API이지만, Winsock에서는 지원되지 않는 API입니다. 하지만, 아래처럼 단지 몇줄만의 코딩으로 이와 똑같은 기능을 하는 함수를 만들어 낼 수 있음을 알 수 있습니다.

char FAR * FAR gethostaddr( void )
{
char szHostName[40];

//로컬 호스트의 이름을 얻습니다.
int nResult = gethostname( szHostName, sizeof(szHostName) );
if( nResult != 0)
return NULL;

//호스트 이름이 유효한지 확인 합니다.
if( lstrcmp( szHostName, "" ) == 0 )
return NULL;

//로컬 호스트 이름을 이용하여 호스트 관련 정보를 찾습니다.
HOSTENT FAR * lphostent = gethostbyname( szHostName );

//호스트 정보를 제대로 얻었는지 확인하고,
if( lphostent == NULL )
return NULL;

//제대로 호스트 관련 정보를 얻었으면, 관련정보중 아이피 스트링을 반환 합니다.
return lphostent->h_addr_list;
}


gethostname

gethostname 함수는 로컬 머신에 대한 호스트 이름을 얻어냅니다.

int gethostname (
char FAR * name,
int namelen
);

Parameters

name
[출력] 로컬 호스트 이름을 담을 버퍼의 포인터

namelen
[입력] 버퍼의 길이를 설정합니다.

Remarks

gethostname 함수는 name 매개변수에 로컬 호스트의 이름을 리턴합니다. 호스트 이름은 NULL 문자로 끝나는 스트링 입니다. 호스트 이름의 형태는 윈도우즈 소켓 프로바이더에 종속적입니다. 즉, 간단한 호스트 이름일 수도 있고, 완벽한 도메인 네임 일 수도 있는 것입니다.

만약 로컬 호스트 이름이 존재하고 있었다면, gethostname 함수는 성공할 것입니다, 그리고 gethostbyname 함수나 WSAAsyncGetHostByName 함수에서 인식 할 수 있는 호스트 이름을 리턴하게 됩니다.

Return Values

아무런 에러가 발생되지 않으면, gethostname 함수는 0을 리턴합니다. 반면, 에러가 발생한 경우에는 SOCKET_ERROR 을 리턴합니다. 또한 이 함수역시 WSAGetLastError 함수를 호출해서 특정한 에러코드를 받아낼 수 있습니다.

Error Codes

WSAEFAULT | name 매개변수가 정확한 user address space가 아니거나, namelen에 넘긴 버퍼크기가 호스트 이름을 모두 담을 만큼의 크기가 아닐경우
WSANOTINITIALISED | 이 함수를 사용하기전에 성공적인 WSAStartup 함수의 호출이 이루어져야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.

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

overview, gethostbyname , WSAAsyncGetHostByName

Sample

아래의 사용예제는 로컬 호스트의 IP Address를 쩜~표기법으로 이루어지는 스트링으로 얻어내는 방법을 보여주는 예제입니다. 버클리 소켓의 경우 로컬 호스트의 아이피 어드레스를 얻어내는 gethostaddr 함수는 지원되는 API이지만, Winsock에서는 지원되지 않는 API입니다. 하지만, 아래처럼 단지 몇줄만의 코딩으로 이와 똑같은 기능을 하는 함수를 만들어 낼 수 있음을 알 수 있습니다.

char FAR * FAR gethostaddr( void )
{
char szHostName[40];

//로컬 호스트의 이름을 얻습니다.
int nResult = gethostname( szHostName, sizeof(szHostName) );
if( nResult != 0)
return NULL;

//호스트 이름이 유효한지 확인 합니다.
if( lstrcmp( szHostName, "" ) == 0 )
return NULL;

//로컬 호스트 이름을 이용하여 호스트 관련 정보를 찾습니다.
HOSTENT FAR * lphostent = gethostbyname( szHostName );

//호스트 정보를 제대로 얻었는지 확인하고,
if( lphostent == NULL )
return NULL;

//제대로 호스트 관련 정보를 얻었으면, 관련정보중 아이피 스트링을 반환 합니다.
return lphostent->h_addr_list;
}


getpeername

getpeername 함수는 소켓이 연결되어 있는 원격지 상대방(peer)의 이름(인터페이스 어드레스와 포트번호)을 얻는 함수입니다.

int getpeername (
SOCKET s,
struct sockaddr FAR* name,
int FAR* namelen
);

Parameters

s
[입력] 사용할 접속된 소켓의 기술자(descriptor)

name
[출력] 원격지 상대방(peer)의 이름을 받을 SOCKADDR 구조체의 포인터

namelen
[입/출력] 입력시에는 name 에 대한 버퍼 포인터의 최대 크기를 나타내고, 출력할 때는 실제로 사용된 버퍼 공간량을 나타내는 정수에 대한 포인터입니다.

Remarks

getpeername 함수는 소켓으로 접속되어 있는 원격지 상대방(peer)의 이름을 name 매개변수인 SOCKADDR 구조체로 반환 합니다. getpeername 함수는 접속된 소켓에 대해서만 사용할 수 있습니다. 데이터 그램 소켓에 대해서는 이전에 connect 함수를 호출했을 경우에만, 원격지 상대방(peer)의 이름(name)을 얻을 수 있습니다. - sendto 함수의 호출에 의해서는 getpeername 함수에 의해서 이름을 얻지는 못할 것입니다.

호출할 때 입력으로, namelen 매개변수는 name 매개변수의 버퍼 사이즈를 명시하고, 함수를 반환 할 때 namelen 매개변수는 실제로 사용된 버퍼 공간량을 나타내는 정수를 포인트 합니다. 일반적으로 프로그램은 getpeername 함수를 호출하기 전에 정수를 sizeof(SOCKADDR) 로 설정한 다음에 반환 값을 무시합니다.

Return Values

에러가 발생하지 않았을 때, getpeername 함수는 0을 반환합니다. 에러가 발생한 경우에는 SOCKET_ERROR을 반환 하고, WSAGetLastError 함수에 의해서 지정된 에러 코드를 검색할 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | name 또는 namelen 매개변수가 올바른 형태가 아닙니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENOTCONN | s 매개변수로 적용하려는 소켓이 접속된 상태가 아닙니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.

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

overview, bind , getsockname, socket


getprotobyname

getprotobyname 함수는 프로토콜 이름에 대응되는 프로토콜 정보를 얻어내는 함수입니다.

struct PROTOENT FAR * getprotobyname (
const char FAR * name
);

Parameters

name
[입력] NULL로 끝나는 프로토콜 이름 스트링의 포인터

Remarks

getprotobyname 함수는 name 매개변수로 넣은 프로토콜과 대응되는 프로토콜 번호와 이름을 포함한 PROTOENT 구조체를 반환합니다. 모든 스트링은 NULL로 끝나는 문자열입니다. PROTOENT 구조체는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

Return Values

에러가 없는 경우에 getprotobyname 함수는 PROTOENT 구조체의 포인터를 리턴합니다. 에러가 발생한 경우에는 NULL 포인터를 반환하게 되죠. 그리고 WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수를 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 찾을 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생으로 프로토콜 데이터 베이스를 엑세스 할 수 없습니다.
WSANO_DATA | 요청된 형태의 데이터 레코드가 없습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEFAULT | name 매개변수가 user address space의 올바를 형태가 아닙니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, getprotobynumber , WSAAsyncGetProtoByName


getprotobynumber

getprotobynumber 함수는 매개변수의 프로토콜 번호와 부합되는 프로토콜 정보를 얻어내는 함수 입니다.

struct PROTOENT FAR * getprotobynumber (
int number
);

Parameters

number
[입력] 호스트 바이트 오더(리틀-인디언) 형태의 프로토콜 번호

Remarks

getprotobynumber 함수는 number 매개변수로 넣은 프로토콜 번호와 대응되는 프로토콜 번호와 이름을 포함한 PROTOENT 구조체를 반환합니다.

PROTOENT 구조체는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

Return Values

에러가 발생하지 않으면, getprotobynumber 함수는 PROTOENT 구조체의 포인터를 리턴합니다. 에러가 발생하면, NULL 포인터를 리턴하게 됩니다. 그리고, WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 찾을 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생으로 프로토콜 데이터 베이스를 엑세스 할 수 없습니다.
WSANO_DATA | 요청된 형태의 데이터 레코드가 없습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, getprotobyname , WSAAsyncGetProtoByNumber


getservbyname

getservbyname 함수는 서비스 이름과 프로토콜에 부합하는 서비스 정보를 얻어냅니다.

struct SERVENT FAR * getservbyname (
const char FAR * name,
const char FAR * proto
);

Parameters

name
[입력] NULL문자로 끝나는 서비스 이름 스트링의 포인터 (서비스의 공식적인 이름이나 공인된 앨리어스입니다.)

proto
[입력] 임의의 프로토콜 이름입니다. proto가 NULL일 경우 getservbyname 함수는 서비스 이름과 일치하는 서비스 데이터 베이스의 첫번째 엔트리를 반환합니다. proto가 NULL이 아닐경우 getservbyname 함수는 서비스 이름과 프로토콜 이름에 일치하는 엔트리를 찾으려고 시도합니다.

Remarks

getservbyname 함수는 name 매개변수 스트링과 일치하는 SERVENT 구조체를 리턴합니다. 모든 스트링은 NULL 문자로 끝나는 스트링입니다.

SERVENT 구조체의 포인터는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

Return Values

에러가 발생하지 않으면, getservbyname 함수는 SERVENT 구조체의 포인터를 리턴합니다. 에러가 발생하면, NULL을 리턴합니다. WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수를 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 찾을 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생으로 프로토콜 데이터 베이스를 엑세스 할 수 없습니다.
WSANO_DATA | 요청된 형태의 데이터 레코드가 없습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, getservbyport, WSAAsyncGetServByName


getservbyport

getservbyport 함수는 지정된 포트와 프로토콜에 부합하는 서비스 정보를 얻어내는 함수입니다.

struct SERVENT FAR * getservbyport (
int port,
const char FAR* proto
);

Parameters

port
[입력] 네트웍 바이트 오더(빅-인디언)로 된 특정 서비스의 포트번호

proto
[입력] 프로토콜 이름에 대한 추가적인 스트링입니다. 만약 이 항목이 NULL이면, getservbyport 함수는 SERVENT 구조체의 s_port 멤버에 일치되는 포트에 대한 첫번째 서비스 항목을 리턴합니다. NULL 이 아닌 경우는 port와 proto 매개변수 양쪽 다 일치하는 서비스 항목을 리턴합니다.

Remarks

getservbyport 함수는 getservbyname 함수와 마찬가지로 SERVENT 구조체에 대한 포인터를 리턴합니다.

SERVENT 구조체의 포인터는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

Return Values

에러가 발생하지 않으면, getservbyport 함수는 SERVENT 구조체의 포인터를 리턴합니다. 에러가 발생하면, NULL을 리턴합니다. WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수를 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAHOST_NOT_FOUND | 올바른 호스트 응답을 찾을 수 없습니다.
WSATRY_AGAIN | 올바른 호스트가 발견되지 않거나 서버에서 에러가 났습니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생으로 프로토콜 데이터 베이스를 엑세스 할 수 없습니다.
WSANO_DATA | 요청된 형태의 데이터 레코드가 없습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEFAULT | proto 매개변수가 적절하지 않습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다.

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

overview, getservbyname , WSAAsyncGetServByPort


getsockname

getsockname 함수는 지정된 소켓에 대한 로컬 이름(인터페이스 어드레스와 포트번호)을 얻어내는 함수입니다.

int getsockname (
SOCKET s,
struct sockaddr FAR* name,
int FAR* namelen
);

Parameters

s
[입력] 바인드된 소켓의 기술자(descriptor)

name
[출력] 로컬 이름을 받을 SOCKADDR 구조체의 포인터

namelen
[입/출력] name 버퍼의 크기

Remarks

getsockname 함수는 name 매개변수에 지정된 소켓 기술자 에 대한 로컬 이름(name)을 반환합니다. 이 함수는 바인드 되었거나 접속된 소켓을 s 매개변수로 하여 사용되는 함수입니다. 이 함수는 처음에 bind 함수를 호출하지 않고 connect 함수를 호출하여 사용할 때 특히 유용합니다. getsockname 함수는 시스템에 셋팅된 로컬 이름을 결정하는 방법만을 제공합니다.

호출시에, namelen 매개변수는 name 버퍼의 크기를 포함한 값을 넘겨줍니다. 반환시에 namelen 매개변수는 name 매개변수의 실제적인 바이트 크기를 포함합니다.

getsockname 함수는 소켓이 connect 나 accept 함수로 연결된 것을 제외하고, 명시되지 않은 어드레스를 바인드 한 경우 호스트 어드레스에 대한 정보를 항상 반환 하지는 않습니다. 윈도우즈 소켓 어플리케이션은 소켓이 접속된 상태를 제외하고, 특정 어드레스가 명시되었다고 간주하지 말아야 합니다. 네트워크 인터페이스가 여러 가지인 호스트가 있을 수 있기 때문에 소켓이 사용하는 어드레스는 아직 알 수 없는 상태입니다. 만일 소켓이 비접속 프로토콜을 사용한다면, 어드레스는 소켓에서 입/출력이 발생할 때까지 사용 할 수 없을 것입니다.

Return Values

에러가 발생하지 않은 경우 0을 반환 합니다. 에러가 발생한 경우에는 SOCKET_ERROR 값이 반환 되며, WSAGetLastError 함수에 의해 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | name 또는 namelen 매개변수가 올바른 형태가 아닙니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEINVAL | 소켓이 bind 함수에 의해서 바인드 되지 않았거나, ADDR_ANY 가 바인드할 때 사용되었으나 접속은 아직 이루어지지 않은 상태 입니다.

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

overview, bind , getpeername, socket


getsockopt

getsockopt 함수는 설정된 소켓 옵션의 값을 얻어내는 함수 입니다.

int getsockopt (
SOCKET s,
int level,
int optname,
char FAR* optval,
int FAR* optlen
);

Parameters

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

level
[입력] 소켓 옵션 레벨이 정의 되며, SOL_SOCKET 과 IPPROTO_TCP 중 하나가 될 수 있습니다.

optname
[입력]이 함수에 의해서 반환될(검색될) 값에대한 소켓 옵션을 명시합니다.

optval
[출력] 요청된 옵션에 대한 반환되는 옵션값이 저장될 버퍼에 대한 포인터 입니다.

optlen
[입/출력] optval 버퍼의 크기를 나타내는 정수로 포인트 합니다.

Remarks

getsockopt 함수는 특정한 형태(type), 특정한 상태(state)로 연관 되어있는 소켓옵션에 대해 설정되어 있는 값을 optval 매개변수에 저장해서 얻어내는 함수입니다. 옵션은 중복 프로토콜 레벨로 존재 할 수 있지만. 가장 우선시 되는 소켓 레벨은 존재합니다. 이러한 옵션은 패킷라우팅이나, out-of-band 데이터의 전송등과 같은 소켓연산에 영향을 미칩니다.

선택된 옵션과 연관된 값은 optval 버퍼로 반환 됩니다. optlen 으로 포인트 되는 정수값은 입력시에 optval 버퍼의 크기를 가지고 있어야 합니다. 반환할 때는, 반환되는 값의 크기로 optlen은 셋팅될 것입니다. 예를들어 SO_LINGER 소켓옵션을 사용할 경우에 optlen 값은 LINGER 구조체의 크기를 명시해야 합니다. 대부분의 다른 옵션들은 정수형(integer)의 크기입니다.

어플리케이션은 명시된 매개변수에 의해서 직접적으로 또는 간접적으로 메모리 공간을 할당하는데 책임을 져야 합니다.

옵션이 setsockopt 함수로 셋팅된적이 없다면, getsockopt 함수는 옵션에 대한 디폴트 값을 반환하게 됩니다.

아래에 getsockopt 함수에 대해서 지원되는 옵션에 대해서 간략히 나열하고 설명 했습니다.

level = SOL_SOCKET

옵션값(Value) | 데이터형태(Type) | 의미(Meaning)
SO_ACCEPTCONN | BOOL | TRUE 일 경우 소켓이 리슨 하고 있습니다.
SO_BROADCAST | BOOL | TRUE 일 경우 소켓은 브로드캐스트(broadcast) 메시지를 전송하기 위해 만들어졌습니다.
SO_DEBUG | BOOL | TRUE 일 경우 디버깅이 가능합니다.
SO_DONTLINGER | BOOL | TRUE 일 경우 SO_LINGER 옵션은 무시됩니다.
SO_DONTROUTE | BOOL | TRUE 일 경우 라우팅이 무시됩니다.
SO_ERROR | int | 에러상태를 반환하고, 클리어 됩니다.
SO_GROUP_ID | GROUP | 소켓이 속해있는 그룹 식별자를 의미합니다.
SO_GROUP_PRIORITY | int | 소켓에 관련된 우선사항은 소켓 그룹의 부분 입니다.
SO_KEEPALIVE | BOOL | TRUE 일 경우 keepalive가 전송되고 있습니다.
SO_LINGER | struct LINGER | 현재의 linger 옵션을 반환 합니다.
SO_MAX_MSG_SIZE | unsigned int | SOCK_DGRAM 과 같은 소켓 형태에서 메시지의 최대 크기입니다. 스트림 소켓에서는 아무런 의미가 없습니다.
SO_OOBINLINE | BOOL | TRUE 일 경우 아웃오브밴드 데이터가 정상적인 데이터 스트림으로 수신되고 있습니다.
SO_PROTOCOL_INFO | WSAPROTOCOL_INFO | 소켓에 대해 바인드된 프로토콜 정보를 나타냅니다.
SO_RCVBUF | int | 수신 버퍼크기를 의미합니다.
SO_REUSEADDR | BOOL | TRUE일 경우 소켓은 이미 사용중인 어드레스로 묶였습니다.
SO_SNDBUF | int | 전송 버퍼의 크기
SO_TYPE | int | 소켓의 타입 (예:SOCK_STREAM, SOCK_DGRAM)

level = IPPROTO_TCP

TCP_NODELAY
         BOOL
         전송합병(send coalescing)을 위해 Nagle 알고리즘이 비활성화 되었습니다.

Return Values

에러가 발생하지 않았을 경우 0을 반환합니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError 함수를 이용해서 특정한 에러코드 값을 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | optval 또는 optlen 매개변수 중의 하나가 올바르지 않거나 optlen 매개변수의 값이 너무 작습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | level 매개변수가 잘못됐거나, 알 수 없는 값 입니다.
WSAENOPROTOOPT | 알 수 없는 옵션이거나, 지원지지 않는 옵션을 사용 했습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.

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

overview, setsockopt , socket, WSAAsyncSelect, WSAConnect, WSAGetLastError, WSASetLastError


Graceful shutdown, linger options and socket closure

이 문서는 소켓의 접속을 셧다운 하는 것과 소켓을 닫는(close)것이라는 주제에 대해서 그 의미를 명확히 하기위해 제공되는 문서입니다. 소켓의 접속을 셧다운(shutting down)하는 것과 소켓을 닫는(close)것의 사이를 구분짖는 것은 매우 중요합니다. 소켓의 접속을 셧다운 한다는 것의 의미는 연결된 두 단말사이의 큐에 버퍼링 되어 있는 메시지를 주고 받는다는 것을 의미합니다. 셧다운 작업은 일반적으로 우아한(graceful)것과 중지(abortive or hard)로 크게 두가지 부분으로 정의 되어 있습니다.

여기서 잠깐! 컴퓨터 관련 문서를 많이 접해 보신분들은 위에서 설명한 graceful 이나 hard 라는 단어에 대해서 익숙하실 겁니다. 하지만, 그렇지 못하신 분들은 이게 먼소리냐고 할지도 모릅니다. 일반적으로 가장 이상적으로 동작하게 되는 형태를 "graceful ...." 한 작업이라고 칭하게 됩니다. 굳이 한국말로 표현하자면, 우아한 ... 가 되겠죠... 반면에 이상적이 형태가 아닌 묵시적이거나 바람직하지 않은 방향으로 처리되는 작업을 "hard ..."라 칭하게 됩니다.

우아한 셧다운의 처리과정에서 큐에 버퍼링 되었지만, 아직 전송되지 않은 데이터는 접속이 종료되기 전에 보내지게 됩니다. 중지처리되는 셧다운의 처리과정에서 이러한 아직 보내지지 않은 데이터는 손실되게 됩니다. 하지만, 셧다운이 되었다고 해서 소켓에 할당된 리소스나 소켓 핸들이 반환 되었다는 것을 의미하지는 않습니다. 즉, 소켓을 닫는다(closing)는 것은 할당된 소켓핸들을 해제(반환) 한다는 것을 의미합니다. 소켓핸들이 해제되었으므로 어떻한 방법으로든 이 해제된 소켓을 사용할 수 없습니다.

윈도즈 소켓에서 shutdown 함수와 WSASendDisconnect 함수는 모두 셧다운 처리과정을 시작하는데 사용할 수 있습니다. 반면에 closesocket 함수는 할당받은 소켓핸들을 해제해고, 할당받은 관련된 리소스들을 해제 하는데 사용됩니다. 그런데 일반적인 프로그래밍 할 때 보면, closesocket 함수가 셧다운 처리과정을 발생시킬 것이라고 하여 사용됩니다. 이러한 점은 우리를 매우 헷갈리게 만들죠, 사실상 closesocket 함수는 셧다운 처리과정을 시작하고, 소켓 핸들을 해제하는 작업 모두에 사용된다고 합니다.

SO_LINGER 와 SO_DONTLINGER 소켓옵션에 대한 적절한 값을 설정 했을경우, closesocket 함수로 아래와 같은 처리의 경우를 얻어낼 수 있습니다.

  • 중지(Abortive) 셧다운 처리과정은, closesocket 함수로부터 바로 반환됩니다.
  • 우아한 셧다운 처리과정은, 셧다운 처리과정이 완료될 때 까지나, 지정한 시간이 다 될 때까지 딜레이 됩니다.
  • 우아한 셧다운으로 처리되고, 바로 반환되는 경우 — 백그라운드로 처리완료 되도록 하는 방식입니다. 비록 이러한 방법이 기본 처리 방법이라 하더라도, 어플리케이션은 언제 우아한 셧다운 처리가 완료되는지 알 수 있는 방법이 없습니다.

접속이 해제되는 동안 발생할 수 있는 문제점을 최소화 하려면, closesocket 함수를 호출해서 암시적으로 셧다운 되는 작업을 하는 것을 피하는 것입니다. closesocket 대신에 shutdown 이나 WSASendDisconnect 함수를 명시적으로 사용하는 방법이 있습니다.

아래의 표는 우아한 셧다운을 시작하기 위한 서버와 클라이언트의 함수사용의 순서를 보여줍니다.

Client Side | Server Side
(1) 세션을 종료하기 위해서 shutdown(s, SD_SEND) 함수를 호출합니다. 그리고, 클라이언트는 더 이상 보낼데이터를 가지고 있지 않고 보내지도 않는 다고 가정합시다. |
 | (2) FD_CLOSE 메시지를 수신받고, 우아한 셧다운은 진행상태에 들어갑니다. 그리고, 수신해야 할 데이터는 모두 수신받습니다.
 | (3) 남아있는 응답 데이터를 전송합니다.
(5') FD_READ 메시지를 얻어내고, 서버로부터 보내진 데이터를 얻어내기 위해 recv 함수를 호출합니다. | (4) 서버는 더 이상 보낼 데이터가 없도록 내부 큐를 비우기 위해 sutdown(s, SD_SEND) 함수를 호출합니다.
(5-2) FD_CLOSE 메시지를 수신합니다. | (4') closesocket 함수를 호출합니다.
(6) closesocket 함수를 호출합니다. |


HOSTENT

HOSTENT 구조체는 윈도우즈 소켓 시스템에 할당됩니다. 애플리케이션에서는 이 구조체를 수정하거나 내용을 비워서는 않됩니다. 또한 각각의 쓰레드에 대하여 이구조체의 한개의 카피본 만이 할당되어야 합니다. 유효성은 다른 윈도우즈 소켓 함수가 호출될 때 까지만 보장되므로 애플리케이션은 이 정보가 필요하다면, 다른 윈도우즈 소켓 함수가 호출되기 전에 특정한 정보를 카피해야 합니다.

struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
};

Members

h_name
호스트의 공식적인 이름입니다. 만약 DNS 나 그와 유사한 시스템이 사용되었을 때, 이 멤버는 FQDN(Fully Qualified Domain Name)을 가지게 됩니다.

h_aliases
호스트 이름과 관계되는 이름(앨리어스)으로, 널로 끝나는 스트링 배열 입니다.

h_addrtype
어드레스 타입을 지정하는데, 윈도우즈 소켓의 경우 항상 PF_INET 입니다.

h_length
각 어드레스의 길이를 지정하며, PF_INET 어드레스에 대해 항상 4 입니다.

h_addr_list
널 문자로 끝나는 호스트의 주소 리스트입니다. 주소는 네트웍 바이트 오더 입니다. 또한 이전 소프트웨어와 호환을 위해서 h_addr_list[0]을 의미하는 h_addr 매크로가 정의되어 있습니다.

See Also

overview, PROTOENT, SERVENT


htonl

htonl 함수는 32-비트의 호스트 바이트 오더(리틀-인디언)로부터 TCP/IP에서 사용되는 네트웍 바이트 오더(빅-인디언)로 변환하는 함수입니다. htonl 함수는 SOCKADDR_IN 구조체에 저장되기 전에 32비트로 처리되는 IP어드레스를 네트웍 바이트 오더로 변환 하는데 주로 사용됩니다.

u_long htonl (
u_long hostlong
);

Parameters

hostlong
[입력] 호스트 바이트 오더로 이루어진 32bit 값

Remarks

htonl 함수는 호스트 바이트 오더(리틀-인디언)인 32-비트 수치를 입력으로 TCP/IP 네트웍에서 사용되는 네트웍 바이트 오더(빅-인디언)인 32-비트 수치를 리턴합니다.

Return Values

htonl 함수는 TCP/IP에서 사용되는 네트웍 바이트 오더(빅-인디언)값 을 리턴합니다.

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

overview, htons, ntohl, ntohs, WSAHtonl, WSAHtons, WSANtohl, WSANtohs


htons

htons 함수는 16-비트 정수로 된 호스트 바이트 오더를 네트웍 바이트 오더로 변환하는 함수입니다. htons 함수는 SOCKADDR_IN 구조체에 저장되기 전에 포트 번호를 네트웍 바이트 오더로 변환하는데 자주 사용됩니다.

u_short htons (
u_short hostshort
);

Parameters

hostshort
[입력] 호스트 바이트 오더(리틀-인디언) 형태인 16-비트 정수.

Remarks

htons 함수는 16-비트인 호스트 바이트 오더를 입력으로 16-비트인 TCP/IP 네트웍에서 사용되는 네트웍 바이트 오더인 정수를 리턴하는 함수입니다.

Return Values

htons 함수는 TCP/IP 네트웍 바이트 오더 값을 리턴합니다.

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

overview, htonl, ntohl, ntohs, WSAHtonl, WSAHtons, WSANtohl, WSANtohs


inet_addr

inet_addr 함수는 10진 형식의 IP 어드레스 문자열을 32-비트 정수(IP어드레스)로 변환합니다. 어드레스는 네트웍 바이트 오더(빅-인디언)로 변환됩니다.

unsigned long inet_addr (
const char FAR * cp
);

Parameters

cp
[입력] 인터넷 표준인 dotted decimal(점으로구분된 아이피) 형식으로 표현되는, null 문자로 끝나는 스트링이 들어갑니다. (예 : "211.56.242.241")

Remarks

inet_addr 함수는 cp 매개변수로 넘어간 스트링을 변환합니다. 이 스트링은 인터넷 표준 쩜~ 표기법인 dotted decimal로 표현됩니다. 입력된 dotted decimal 은 결국 아이피 스트링을 네트웍 바이트 오더(빅-인디언)인 32-비트 unsigned long을 반환하게 되는거죠.

Return Values

아무런 에러가 발생하지 않았다면, inet_addr 함수는 인터넷 주소를 표현하는데 적절한 바이너리 표현식인 unsigned long 값(빅인디언 형식) 을 반환합니다. 만약 cp 매개변수에 적절하지 않은 값을 넘길경우 (예 : "211.56.242.523") 에는 inet_addr 은 INADDR_NONE 이라는 그런 주소는 찾을 수 없다는 의미의 값을 리턴하게 됩니다.

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

overview, inet_ntoa


inet_ntoa

inet_ntoa 함수는 인터넷 네트웍 주소(Ipv4)를 인터넷 표준 쩜 표기법 형태의 주소로 변환합니다.

char FAR * inet_ntoa (
struct in_addr in
);

Parameters

in
[입력] 인터넷 호스트 주소를 표현하는 IN_ADDR 구조체

Remarks

inet_ntoa 함수는 네트웍 바이트 오더인 IP 어드레스의 포맷을 10진 문자열로 지정합니다. IP 어드레스는 IN_ADDR 구조체의 형태로 inet_ntoa 함수에 제공됩니다. 선언에 의해 IN_ADDR 구조체에 있는 IP 어드레스는 이미 네트웍 바이트 오더 입니다. inet_ntoa 함수에 의해 반환된 문자열은 해당 윈도우즈 소켓 시스템에 지정된 메모리에 상주하게됩니다. 주의 할 점은 애플리케이션이 이 메모리를 비워서는 안 됩니다. 그리고, 다음 윈도우즈 소켓함수가 호출될 때 까지 문자열의 유효성이 보장 되므로 필요할 경우 애플리케이션은 문자열의 복사본을 만들 수 있습니다.

Return Values

아무런 에러가 발견되지 않는다면, inet_ntoa 함수는 쩜표기법으로 이루어진 IP 어드레스를 가지고 있는 스트링을 리턴하게 됩니다. 에러 발생시에는 NULL 을 리턴합니다.

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

overview, inet_addr


IN_ADDR

struct   in_addr {
union {
struct
{
unsigned  char   s_b1,
s_b2,
s_b3,
s_b4;
}  S_un_b;

struct {
unsigned  short  s_w1,
s_w2;
}  S_un_w;

unsigned long  S_addr;
} S_un;
};

IN_ADDR 구조체를 통해 바이트 집합, 한 쌍의 16비트 워드, 하나의 32 비트 워드로서 IP 어드레스에 접근할 수 있습니다. 이러한 유연성은 때론 코딩시 상당히 성가신 구문을 만들어 내기도 하죠. 예를들어 아래와 같은 코드는 가독성이 떨어질 수 도 있습니다.

sockaddr_in sin;
sin.sin_addr.S_un.S_addr = ...

이러한 복잡성을 해결하고자 윈도우즈 소켓에서는 어드레싱 구문의 한 레벨을 제거하는 매크로들을 선언하고 있습니다. 아래와 같이 말이죠.

#define s_addr Sun.S_addr

이 매크로를 이용하면, 위의 코드를 아래와 같이 간단히 바꿀 수 있습니다.

sockaddr_in sin;
sin.sin_addr.s_addr = ...

See Also

overview, SOCKADDR, SOCKADDR_IN


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

overview, getsockopt , setsockopt, socket, WSAAsyncSelect, WSAEventSelect, WSAIoctl


LINGER

struct linger {
u_short l_onoff;
u_short l_linger;
}

Members

l_onoff

SO_LINGER를 활성화 하기위해서, 어플레케이션은 l_onoff 멤버를 0이 아닌 값으로 설정하고, l_linger 멤버를 0으로설정하거나, 원하는 타임아웃 값(초 단위로)을 설정해야 한 후, setsockopt 함수를 호출해야 합니다. SO_DONTLINGER를 활성화 하기위해서(즉, SO_LINGER를 비활성화 한다는 얘기겠죠) l_onoff 멤버를 0으로 설정하고, setsockopt 함수를 호출합니다. 비동기 소켓에서 0이 아닌 타임아웃 값을 가지고 SO_LINGER를 활성화 하는 것은 바람직하지 않다는 점을 염두해 두기 바랍니다.

SO_LINGER를 활성화 하는 것은 또한 SO_DONTLINGER를 비활성화 시킵니다. SO_DONTLINGER가 비활성화 된다면(즉, SO_LINGER가 활성화 된다는 의밉니다.) 타임아웃 값은 지정되지 않습니다. 만약 이전에 타임아웃 값이 소켓에 적용되었다면, 타임아웃 값은 서비스 프로바이더에 의해서 원래 상태로 복원되게 됩니다.

See Also

overview, setsockopt


제목없음

listen

listen 함수는 외부로부터 들어오는 접속을 감지하기 위해 특정 소켓이 사용될 것임을 윈도우즈 소켓에게 알리는 함수입니다.

int listen (
SOCKET s,
int backlog
);

Parameters

s
[입력] 리슨 하기위해 사용될 소켓의 기술자(descriptor)를 명시합니다.

backlog
[입력] 대기하는 접속을 위한 큐의 최대 길이를 명시합니다. 이 값이 SOMAXCONN 일 경우, 기본 서비스 프로바이더가 적절한 최대 큐의 길이를 설정하는 일을 담당하게 됩니다.

Remarks

접속을 허용하기 위해서 소켓은 우선 socket 함수를 이용해서 소켓을 생성합니다. 그런다음 bind 함수를 이용해서 로컬 어드레스를 바인드하죠. 마지막으로 accept 함수로 접속을 허용합니다. 들어오는 접속요청을 임시저장 하기 위한 큐의 길이는 listen 함수의 backlog 매개변수에 의해서 명시됩니다. listen 함수는 접속 지향형(connection oriented)소켓(예:SOCK_STREAM) 의 경우에만 사용된다는 점 명심합시다.

일반적으로 listen 함수는 한번에 하나 이상의 접속 요구를 가질 수 있는 서버에 사용됩니다. 만약 접속요청이 들어오고, 큐가 가득 차있으면, 프로그램은 WSAECONNREFUSED 라는 에러코드를 일으키며 실패를 할 것입니다.

어플리케이션은 같은 소켓에 대해서 한번이상의 listen 함수를 호출 할 수 있습니다. 이렇게 함으로써 리슨 소켓에 대한 현재의 큐의 최대크기(backlog)를 업데이트 할 수 있습니다. 새로 설정된 큐의 크기보다 더 많은 접속을 하려고 하는 요구가 있을 경우 초과되는 접속요청은 리셋되고, 버려집니다.

Compatibility

backlog 매개변수는 기본 서비스 프로바이더에 의해서 결정되는 적절한 값으로 제한됩니다. 범위를 넘어서거나 잘못된 값을 설정하는 경우 서비스 프로바이더는 적절한 가장 가까운 값으로 이 값을 대체시킵니다. 사실상 실제적인 backlog 값을 알아 낼 수 있는 표준 규정 같은건 없습니다. 그저 일반적으로 SOMAXCONN으로 설정하는 방법이 일반적입니다.

Return Values

에러가 발생하지 않은 경우 listen 함수는 0을 반환 합니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고 WSAGetLastError 함수를 이용해서 특정 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEADDRINUSE | 소켓이 SO_REUSEADDR 옵션으로 마크되어 있지 않은 상태에서 소켓의 로컬 주소가 이미 사용 중입니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | 소켓이 bind 함수를 사용하여 바인드 되지 않았습니다.
WSAEISCONN | 리슨소켓으로 사용하려고 하는 소켓이 접속된 상태의 소켓입니다.
WSAEMFILE | 사용가능한 소켓 기술자(descriptor)가 남아있지 않습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 남아있지 않습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | socket s 매개변수로 넘긴 소켓이 리슨 연산을 지원하기에 적절한 형태의 소켓이 아닙니다.

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

overview, accept, connect, socket


ntohl

ntohl 함수는 32-비트에 대한 TCP/IP 네트웍 바이트 오더를 호스트 바이트 오더로 변환합니다. (빅-인디언을 리틀-인디언으로 변환)

u_long ntohl (
u_long netlong
);

Parameters

netlong
[입력] TCP/IP 네트웍 바이트 오더인 32-비트 정수입니다.

Remarks

ntohl 함수는 TCP/IP 네트웍 바이트 오더인 32-비트 정수를 입력으로 호스트 바이트 오더인 32-비트 정수를 리턴하는 함수입니다.

Return Values

ntohl 함수는 항상 호스트 바이트 오더 값을 리턴합니다. 만약 netlong 매개변수가 이미 호스트 바이트 오더라면, 아무런 연산도 일어나지 않습니다.

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

overview, htonl , htons , ntohs , WSAHtonl , WSAHtons , WSANtohl , WSANtohs


ntohs

ntohs 함수는 16-비트에 대한 TCP/IP 네트웍 바이트 오더를 호스트 바이트 오더로 변환합니다. (빅-인디언을 리틀-인디언으로 변환)

u_short ntohs (
u_short netshort
);

Parameters

netshort
[입력] TCP/IP 네트웍 바이트 오더인 16-비트 정수입니다.

Remarks

ntohs 함수는 TCP/IP 네트웍 바이트 오더인 16-비트 정수를 입력으로 호스트 바이트 오더인 16-비트 정수를 리턴하는 함수입니다.

Return Values

ntohs 함수는 항상 호스트 바이트 오더 값을 리턴합니다. 만약 netshort 매개변수가 이미 호스트 바이트 오더라면, 아무런 연산도 일어나지 않습니다.

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

overview, htonl , htons , ntohl , WSAHtonl , WSAHtons , WSANtohl , WSANtohs


Socket Structure (¼ÒÄÏ ±¸Á¶Ã¼)

 1. BSD style APIs

1.1 Transformation Functions

htonl
htons
inet_addr
inet_ntoa
ntohl
ntohs

1.2 DataBase Functions

gethostbyaddr
gethostbyname
gethostname
getprotobyname
getprotobynumber
getservbyname
getservbyport

1.3 Socket Functions

accept
bind
closesocket
connect
getpeername
getsockname
getsockopt
ioctlsocket
listen
recv
recvfrom
select
send
sendto
setsockopt
shutdown
socket

2. Windows Socket Extension APIs

2.1 Transformation Functions

WSAHtonl
WSANtohl
WSAHtons
WSANtohs

2.2 DataBase Functions

WSAAsyncGetHostByAddr
WSAAsyncGetHostByName
WSAAsyncGetProtoByName
WSAAsyncGetProtoByNumber
WSAAsyncGetServByName
WSAAsyncGetServByPort
WSAEnumProtocols

2.3 Socket Functions

WSAAsyncSelect
WSACancelAsyncRequest
WSACancelBlockingCall
WSACleanup
WSAGetLastError
WSAIsBlocking
WSASetBlockingHook
WSASetLastError
WSAStartup
WSAUnhookBlockingHook
WSAEventSelect
WSAAccept
WSASend
WSASendTo
WSARecv
WSARecvFrom
WSAConnect
WSAloctl
WSAJoinLeaf
WSARecvEx
WSASocket
WSAWaitForMultipleEvents
WSAEnumNetworkEvents
WSACreateEvent
WSAGetOverlappedResult
WSASetEvent
WSAResetEvent

3. Socket Structures


PROTOENT

struct protoent {
char FAR * p_name;
char FAR * FAR * p_aliases;
short p_proto;
};

Members

p_name
프로토콜의 공식적인 이름

p_aliases
프로토콜 이름과 관계되는(앨리어스 집함) 널로 끝나는 스트링 포인터

p_proto
호스트 바이트 오더로 이루어진 프로토콜 번호

반환되는 포인터는 윈도우즈 소켓 시스템 자체에 할당된 구조체로 포인트 합니다. 애플리케이션이 이 메모리를 비우거나 내용을 수정할 수 없으며, 구조체에 저장된 데이터는 다음 윈도우즈 소켓이 호출될 때까지만 유효하므로, 필요할 경우 애플리케이션은 데이터의 복사본을 만들 수 있습니다.

See Also

overview, HOSTENT, SERVENT


recv

recv 함수는 접속되어 있는 소켓으로부터 들어오는 데이터를 수신하는 함수입니다.

int recv (
SOCKET s,
char FAR* buf,
int len,
int flags
);

Parameters

s
[입력] 접속된 소켓을 명시하는 기술자(descriptor)입니다.

buf
[출력] 수신받은 데이터를 저장할 버퍼입니다.

len
[입력] 버퍼의 길이를 명시합니다.

flags
[입력] recv 함수의 기본작업(수신받은 데이터를 큐에서 읽어내고 제거하는 작업)이 아닌 다른 작업을 하게 하기 위해 이 플래그를 설정합니다.

Remarks

recv 함수는 접속 지향형 소켓(connection-oriented socket)이나 비접속 지향형 소켓(connectionless socket)에서 수신되는 데이터를 읽기위해 사용됩니다. 접속지향형 프로토콜(connection-oriented protocol)을 사용 할 때, 소켓은 recv 함수를 호출하기 전에 미리 접속된 상태여야 합니다. 비접속 프로토콜(connectionless protocol)을 사용 할 경우, 소켓은 recv 함수를 호출하기 전에 미리 바인드 되어 있어야 합니다.

이 함수를 쓰기 전에, 소켓의 로컬 어드레스를 알아내야 하는데요. 서버 어플리케이션에서는 명시적인(explicit) bind 함수나 accept 또는 WSAAccept 함수를 사용해서 알아 냅니다. 이러한 명시적인(explicit) 바인딩을 클라이언트 어플리케이션에서 사용했을 때 좋지 않은 결과를 낼 수 있습니다. 클라이언트 어플리케이션을 위해, 소켓은 connect, WSAConnect, sendto, WSASendTo, 또는 WSAJoinLeaf 함수를 이용해서 묵시적으로 로컬 어드레스를 바인드 할 수 있습니다.

접속된 또는 접속되지 않은 소켓에 대해서 이 함수는 수신된 메시지가 허용된 곳으로 부터의 어드레스를 제한합니다. 이 함수는 명시된 원격지 주소로부터 메시지를 반환하기만 합니다. 다른 주소들로 부터의 메시지는 (살며시?) 버립니다. (해석이 넘 이상 합니다... 아래에 원문을 첨가 하도록 하겠습니다. 지성~)

<원문내용>
For connected or connectionless sockets, this function restricts the addresses from which received messages are accepted. The function only returns messages from the remote address specified in the connection. Messages from other addresses are (silently) discarded

접속 지향형 소켓(connection-oriented socket : ex:SOCK_STREAM)일 경우에, recv 함수는 이용 가능한 많은 정보를 반환 할 것입니다. 만약 아직 읽혀지지 않은 out-of-band 데이터가 남아있고, 소켓이 out-of-band 데이터의 인라인 수신을 할 수 있다면(이럴 경우 소켓옵션이 SO_OOBINLINE으로 설정되어 있어야 겠죠?), out-of-band 데이터는 읽여질 것입니다. 어플리케이션은 더 읽기위해 남아있는 out-of-band 데이터가 있는지 없는지 확인하기 위해 ioctlsocket 이나 WSAloctl의 SIOCATMARK 컴맨드를 사용 할 수 있습니다.

비접속 소켓(connectionless sockets : ex. SOCK_DGRAM 또는 다른 메시지 지향형 소켓(message-oriented sockets))일 경우 데이터는 connect 함수에 의해서 명시된 목적 어드레스로부터 날라온, 메시지 큐에 쌓여진 데이터그램중 첫 번째 데이터그램을 읽어냅니다.

데이터 그램이나 메시지가 지정된 버퍼 크기보다 더 클 경우에는 데이터그램의 첫 번째 부분부터 채워지고, recv 함수는 WSAEMSGSIZE 라는 에러코드를 발생시킵니다. UDP 와 같이 데이터의 신뢰성을 보장할 수 없는 프로토콜의 경우 초과된 데이터는 손실되게 됩니다. TCP와 같이 신뢰할 수 있는 프로토콜의 경우 데이터는 충분히 큰 버퍼를 가지고 recv 함수가 성공적으로 수행 될 때 까지 서비스 프로바이더에 의해서 남겨지게 됩니다.

만약 수신할 데이터가 없게되면, recv 함수는 수신할 데이터가 들어 올 때까지 블록킹 상태에 걸립니다.

소켓이 접속지향형(connected oriented) 이고 원격지 지점에서 접속이 셧다운(우아한(gracefully) 종료) 되어 버리고, 현재 그 원격지에서 보낸 데이터를 수신되고 있는 상태라면, recv 함수는 데이터를 하나도 받지 못한 상태에서 동작을 완료합니다. 접속이 리셋 되어 버린 경우엔 WSAECONNRESET 이라는 에러코드를 발생하며 함수의 수행은 실패 하게 됩니다.

flag 매개변수는 소켓에 대해 명시된 옵션 이상의 함수동작에 영향을 미치기 위해서 사용될 수 있습니다. 함수의 의미체계는 소켓옵션 그리고, flag 매개변수에 의해서 결정되어 집니다. flag 매개변수를 이용한 방법의 경우 아래의 값을 OR 비트연산을 취해서 구성되어 집니다. 즉, 쉽게 말해서 recv 함수가 기본적으로 수행하는 수신된 데이터를 일고 수신큐에서 제거하는 일 이외의 원하는 다른 처리를 할 수 있도록 하는 플래그 라는 의미입니다.

Value | Meaning
MSG_PEEK | MSG_PEEK 플래그는 수신큐에 있는 데이터를 읽기만 하는 작업을 하게 합니다. 데이터는 단지 읽어서 특정한 버퍼로 복사가 가능하지만, 수신 큐에 있는 데이터를 제거하지는 않습니다.
MSG_OOB | MSG_OOB 플래그는 out-of-band 데이터의 처리에 사용됩니다.

Return Values

에러가 발생하지 않으면, recv 함수는 읽혀진 데이터의 바이트 수를 반환 합니다. 만약 접속이 종료(우아한종료) 되었다면, 0을 반환 하게 됩니다. 에러가 발생한 경우 SOCK_ERROR 값이 반환 되며, WSAGetLastError 함수를 이용해 특정한 에러 코드를 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | buf 매개변수가 제대로 된 형태가 아닙니다.
WSAENOTCONN | 소켓이 접속된 상태가 아닙니다.
WSAEINTR | 블록킹 호출이 WSACancelBlockingCall 함수에서 취소되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENETRESET | 연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓이 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 가 명시되었지만, 소켓은 SOCK_STREAM 과 같은 형태의 스트림 형태가 아닙니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK | 소켓이 넌블록킹(비동기)로 마킹되어 있고, 수신 연산이 블록킹 상태입니다.
WSAEMSGSIZE | 수신된 메시지가 지정된 버퍼에 저장하기에 너무 커서 손실 되었습니다.
WSAEINVAL | 소켓이 bind 함수에 의해서 바인드 되지 않았거나, 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE 옵션을 가능하게 한 상태 에서 MSG_OOB 플래그가 소켓에 대해서 명시되었습니다. 또는 len 매개변수가 0 이거나 0보다 작습니다.
WSAECONNABORTED | 가상 연결 회로망이 타임아웃이나 다른 실패 때문에 끊어져 버렸습니다.
WSAETIMEDOUT | 접속이 네트웍 실패나 상대방 시스템의 응답 실패로 인하여 드랍 되어 버렸습니다.
WSAECONNRESET | 가상 회로망이 원격지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다.

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

overview, recvfrom , select, send, socket, WSAAsyncSelect, WSARecvEx


recvfrom

recvfrom 함수는 소켓으로부터 데이터그램을 수신하고, 관련된 어드레스 및 포트 번호를 반환 하는 함수입니다.

int recvfrom (
SOCKET s,
char FAR* buf,
int len,
int flags,
struct sockaddr FAR* from,
int FAR* fromlen
);

Parameters

s
[입력] 바인드된 소켓을 기술하는 식별자(descriptor)입니다.

buf
[출력] 수신되는 데이터를 복사할 버퍼입니다.

len
[입력] 버퍼의 길이

flags
[입력] 함수의 호출로 어떤 작업을 할 건지 명시하는 플래그입니다.

from
[출력] 수신받은 데이터를 송신한 단말의 어드레스를 리턴받기 위한 버퍼 포인터입니다.

fromlen
[입/출력] from 버퍼의 사이즈를 위한 포인터 입니다.

Remarks

recvfrom 함수는 접속된 소켓과 접속되지 않은 소켓에서 수신되는 데이터를 읽고 데이터를 보낸곳의 주소를 얻어내는 함수입니다. 이 함수를 사용하기 전에 소켓의 로컬 어드레스를 알아야 하는데, 서버 어플리케이션에서는 명시적인 bind 함수를 사용해서 알아냅니다. 이러한 명시적인(explicit) 바인딩은 클라이언트 어플리케이션에서 사용 했을 때 좋지 않은 결과를 낼 수 있습니다. 이 함수를 사용하는 클라이언트 어프리케이션은 sendto, WSASendTo 또는 WSAJoinLeaf 함수를 이용해서 묵시적으로 로컬 어드레스를 바인드 할 수 있습니다.

SOCK_STREAM 형태와 같은 스트림 소켓(stream oriented sockets)에서 recvfrom 함수는 이용가능한 많은 정보를 반환 할 것입니다. 만약 아직 읽혀지지 않은 out-of-band 데이터가 남아있고, 소켓이 out-of-band 데이터의 인라인 수신을 할 수 있다면(이럴 경우 소켓 옵션이 SO_OOBINLINE 으로 설정되어 있어야겠죠?) out-of-band 데이터는 읽혀질 것입니다. 어플리케이션은 더 읽기위해 남아있는 out-of-band 데이터가 있는지 없는지 확인하기 위해 ioctlsocket이나 WSAIoctl 의 SIOCATMARK 컴맨드를 사용할 수 있습니다.

메시지 지향형 소켓(message-oriented sockets))일 경우 데이터는 첫 번째로 저장된 메시지를 버퍼크기 만큼 읽어냅니다. 데이터 그램이나 메시지가 지정된 버퍼 크기보다 더 클 경우에는 데이터그램의 첫 번째 부분부터 채워지고, recvfrom 함수는 WSAEMSGSIZE 라는 에러코드를 발생시킵니다. UDP 와 같이 데이터의 신뢰성을 보장할 수 없는 프로토콜의 경우 초과된 데이터는 손실되게 됩니다.

만약 from 매개변수가 0이 아니고, 소켓이 접속지향형이 아니라면, 데이터를 보낸 상대방(peer)의 네트웍 어드레스는 SOCKADDR 구조체인 from에 저장됩니다. fromlen 매개변수는 SOCKADDR 구조체의 크기를 건네주게 되고, 반환 할 때는 SOCKADDR 구조체에 저장된 실제 어드레스 크기를 되돌립니다.

만약 수신할 데이터가 없게되면, recvfrom 함수는 수신할 데이터가 들어 올 때까지 블록킹 상태에 걸립니다.

소켓이 접속지향형(connected oriented) 이고 원격지 지점에서 접속이 셧다운(우아한(gracefully) 종료) 되어 버린 상태라면, recvfrom 함수는 데이터를 하나도 받지 못한 상태에서 동작을 완료합니다. 접속이 리셋 되어 버린 경우엔 WSAECONNRESET 이라는 에러코드를 발생하며 함수의 수행은 실패 하게 됩니다.

flag 매개변수는 recvfrom 함수가 기본적으로 수행하는 수신된 데이터를 일고 수신큐에서 제거하는 일 이외의 원하는 다른 처리를 할 수 있도록 하는 플래그입니다. 이 플래그에는 아래와 같은 값이 사용됩니다.

Value | Meaning
MSG_PEEK | MSG_PEEK 플래그는 수신큐에 있는 데이터를 읽기만 하는 작업을 하게 합니다. 데이터는 단지 읽어서 특정한 버퍼로 복사가 가능하지만, 수신 큐에 있는 데이터를 제거하지는 않습니다.
MSG_OOB | MSG_OOB 플래그는 out-of-band 데이터의 처리에 사용됩니다.

Return Values

에러가 발생하지 않으면, recvfrom 함수는 읽혀진 데이터의 바이트 수를 반환 합니다. 만약 접속이 종료(gracefully closed) 되었다면, 0을 반환 하게 됩니다. 에러가 발생한 경우 SOCK_ERROR 값이 반환 되며, WSAGetLastError 함수를 이용해 특정한 에러 코드를 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | buf 매개변수가 제대로 된 형태가 아닙니다.
WSAEINTR | 블록킹 호출이 WSACancelBlockingCall 함수에서 취소되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | 소켓이 bind 함수에 의해서 바인드 되지 않았거나, 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE 옵션을 가능하게 한 상태 에서 MSG_OOB 플래그가 소켓에 대해서 명시되었습니다. 또는 len 매개변수가 0 이거나 0보다 작습니다.
WSAEISCONN | 소켓이 접속되어 있습니다. 이 함수는 접속 지향형 소켓이건 비접속 지향형 소켓이건간에 접속되어 있는 소켓을 허용 하지 않습니다. (아!!! 정말 돌아 버리겠습니다... 분명, 위의 remark 에서는 "접속된 소켓과 접속되지 않은 소켓에서 수신되는 데이터를 읽고 데이터를 보낸곳의 주소를 얻어내는 함수입니다." 라고 설명 해 놓고 이제와서 허용하지 않는다니... 이게 무슨 마른 하늘에 날벼락 이란 말입니까... 된다는 말인지 안 된다는 말인지 쪄비~ ㅠㅠ 원문을 첨가 하겠습니다. ) The socket is connected. This function is not permitted with a connected socket, whether the socket is connection-oriented or connectionless.
WSAENETRESET | T연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓이 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 가 명시되었지만, 소켓은 SOCK_STREAM 과 같은 형태의 스트림 형태가 아닙니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK | 소켓이 넌블록킹(비동기)로 마킹되어 있고, 수신 연산이 내부적으로 아직 기다림 상태입니다.
WSAEMSGSIZE | 수신된 메시지가 지정된 버퍼에 저장하기에 너무 커서 손실 되었습니다.
WSAETIMEDOUT | 접속이 네트웍 실패나 상대방 시스템의 응답 실패로 인하여 드랍 되어 버렸습니다.
WSAECONNRESET | 가상 회로망이 원격지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다.

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

overview, recv , send, socket, WSAAsyncSelect, WSAEventSelect


select

select 함수는 한개 또는 그 이상의 소켓 상태를 결정하고, 동기 입출력을 수행 하기위해 필요할 경우 대기 하는 함수입니다.

int select (
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);

Parameters

nfds
[입력] 버클리 소켓과 호환되는 소켓을 제외 하고는 이 매개변수는 무시됩니다. 버클리 소켓에서 이 매개변수는 I/O 변화를 감지 할 총 소켓의 갯수+1 의 값을 지정하는 용도로 사용합니다.

readfds
[입/출력] 읽기상태의 변화를 감지할 소켓을 지정합니다.

writefds
[입/출력] 쓰기상태의 변화를 감지할 소켓을 지정합니다.

exceptfds
[입/출력] 예외상태 변화를 감지할 소켓을 지정합니다.

timeout
[입력] select 함수가 기다리기 위한 시간입니다. NULL 일경우 지정한 I/O변화가 발생했을 때까지 계속 기다립니다.

Remarks

select 함수는 한개 또는 그 이상의 소켓상태(I/O의 발생유무 상태)를 결정하는데 사용됩니다. FD_SET 구조체의 타입의 인자인 readfds, writefds, exceptfds는 각각 읽기, 쓰기, 예외상황 발생과 같은 I/O변화가 발생 했을 때 이를 감지할 대상이 되는 소켓들을 지정하는 배열형 구조체 입니다. 즉, 이 세가지 구조체를 통하여 어떤 소켓에서 어떤 I/O 변화 발생을 감지할지를 선택하여 지정할 수 있습니다. FD_SET 구조체를 처리하기 위해서 일련의 매크로들이 제공되게 됩니다. 이러한 매크로들은 버클리 소켓과 호환성이 있습니다. 하지만, 내부적인 표현 방법은 근본적으로 다릅니다.

readfds 매개변수에는 "입력받을 수 있는 상태"(readability)와 같은 입력(Input)에 대해 변화가 발생 했을때 감지할 대상이 되는 소켓들을 지정합니다. 예를들어 소켓이 리슨 상태라면, 상대방의 접속의 요청에 대한 감지나, 수신큐에 데이터가 수신되었을 때 이를 감지 할 수 있게 됩니다. 어플리케이션은 이런 상황이 감지 되었을때 접속을 허용 하거나 데이터를 수신할 수 있습니다.

writefds 매개변수에는 "출력 할 수 있는 상태"(writability)와 같은 출력(Output)에 대해 변화가 발생 했을때 감지할 대상이 되는 소켓들을 지정합니다. 예를들어 소켓이 connect 함수를 처리하고 있으며, 소켓이 성공적으로 접속이 완료되었을때 다른 데이터를 송신 할 수 있다 라는 변화의 감지나, sendto, WSASendTo 등의 함수가 성공적으로 수행 될수 있을때가 언제인지 감지 할 수 있게 됩니다. 어플리케이션은 이런 상황이 감지 되었을때 소켓에 대한 다른 처리를 하거나, 데이터를 송신 할 수 있습니다.

exceptfds 매개변수는 out-of-band 데이터의 감지를 위해서, 또는 예외적인 에러 상황을 감지하기 위해서 사용됩니다.

readfds, writefds, 또는 exceptfds 매개변수중 두개는 NULL을 가질 수 있습니다. 하지만, 적어도 한개는 NULL 이면 않됩니다. 또한 NULL이 아닌 FD_SET 구조체는 적어도 한개의 소켓을 가지고 있어야 한다는 점을 명심하세요.

windsock(2).h 헤더 파일에는 소켓기술자 세트(ex. FD_SET)를 처리하기 위해서 4가지 종류의 매크로를 정의 해 놓고 있습니다. FD_SETSIZE 값은 소켓기술자 세트(ex. FD_SET)에 들어갈 수 있는 소켓 기술자의 최대 갯수를 결정하는 수치입니다. (FD_SETSIZE 의 기본치는 64입니다. 이값은 winsock(2).h 헤더파일에서 FD_SETSIZE 가 정의 되어 있지 않을 경우 FD_SETSIZE를 64로 정의 하므로 이 헤더파일을 인클루드 하기전에 다른 값을 FD_SETSIZE에 정의해서 변경 할 수 있습니다.)
내부적으로, 소켓기술자 세트로 사용되는 FD_SET 구조체 안에 있는 소켓핸들은 버클리 유닉스와 같은 비트 플래그로 표현되지 않습니다(버클리 유닉스 에서는 세트되어 있다는 것을 1로 그렇지 않은 것을 0으로 표현하죠.). 이 소켓핸들 데이터 표현법은 확실히 정의된 것이 아닙니다. 이렇게 확실히 정의 해 놓지 않은 이유는, 다른 소켓환경 사이에서 소프트웨어를 포팅 하려할 때, 많은 확장성을 제공해 주기 위함입니다. FD_SET 구조체를 처리하는 매크로는 다음과 같습니다.

FD_CLR(s, *set)
지정된 소켓 기술자(descriptor)를 세트에서 제거 합니다.

FD_ISSET(s, *set)
지정된 소켓 기술자가 세트에 있을 경우 0이 아닌값을 반환하고, 없을 경우 0을 반환합니다.

FD_SET(s, *set)
지정된 소켓 기술자를 세트에 추가 합니다.

FD_ZERO(*set)
모든 소켓 기술자를 세크에서 제거합니다.

timeout(TIMEVAL) 매개변수가 NULL 일 경우 select 함수는 하나 이상의 소켓이 읽기 가능한 것이 되거나, 쓰기 가능한 것이 되거나, 에러 상황이 발생할 때까지 무제한으로 대기합니다. NULL이 아니라면, select 함수는 하나 이상의 소켓이 지정된 기준(일기, 쓰기, 예외)을 만나거나 timeout 값에 일를 때까지 대기합니다. timeout 매개변수가 {0,0}으로 초기화 되어있다면, select 함수는 바로 리턴될 것입니다. 이렇게 초기화 하는 것은 선택된 소켓의 상태를 "poll" 하기 위해서 사용 하는 방법입니다.

Note : select 함수는 WSAAsyncSelect 나 WSAEventSelect 함수로 등록된 소켓 이벤트에 대해서 아무런 영향을 미치지 않습니다.

Return Values

select 함수는 FD_SET 구조체에 포함되어 지정된 I/O에 준비하고 있는 소켓 핸들의 총 갯수를 반환합니다. 지정된 타임아웃 시간을 초과하면, 0을 반환하고 에러가 발생 한 경우 SOCKET_ERROR을 반환하고, WSAGetLastError 함수로 특정한 에러코드를 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAEFAULT | 윈속이 내부적인 동작을 위한 리소스를 할당받지 못했거나, readfds, writefds, exceptfds 또는 timeval 매개변수가 잘못된 값입니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEINVAL | timeout 값이 잘못넘겨졌거나, 소켓 기술자 세트를 넘겨주는 3개의 매개변수가 모두 NULL 입니다.
WSAEINTR | 블록킹 호출이 WSACancelBlockingCall 함수에서 취소되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENOTSOCK | 소켓 기술자 세트 중의 하나가 소켓이 아닌 항목을 포함하고 있습니다.

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

overview, accept, connect, recv, recvfrom, send, WSAAsyncSelect, WSAEventSelect


send

send 함수는 접속되어 있는 상대방 소켓으로 데이터를 보내는 함수입니다.

int send (
SOCKET s,
const char FAR * buf,
int len,
int flags
);

Parameters
s
[입력] 접속되어 있는 소켓의 기술자(descriptor)를 기술합니다.

buf
[입력] 전송하려는 데이터를 가지고 있는 버퍼

len
[입력] buf 안에있는 데이터의 길이

flags
[입력] 함수의 호출이 어떤일을 할지 나타내는 플래그 입니다.

Remarks

send는 접속된 소켓에서 데이터를 접속된 상대방으로 전송하는데 사용되는 함수입니다. 메시지 지향 소켓(message-oriented sockets)에서 최대 패킷크기(getsockopt 함수로 SO_MAX_MSG_SIZE 옵션의 값을 얻어내서 최대 크기를 구할 수 있습니다.)를 초과하지 않도록 주의 해야 합니다. 만약 데이터가 전송되기에 너무 크다면, 데이터는 전송되지 않고, WSAEMSGSIZE 에러코드를 발생합니다.

send 함수의 성공적인 종료가 성공적인 데이터의 전송을 의미하지는 않는다는 점을 명심하세요.

전송 시스템에 사용 가능한 버퍼가 없다면, 소켓이 넌블록킹(비동기)모드일 경우를 제외하고 send는 블록합니다. 비동기 스트림 소켓(nonblocking stream oriented sockets)에서 전송된 바이트의 크기는 1부터 요청된 데이터의 길이 사이의 수가 될 수 있습니다. select, WSAAsyncSelect, WSAEventSelect 함수는 한번 데이터를 전송하고 언제 다른 데이터를 보낼 수 있는지를 결정하는데 사용됩니다. 데이터는 아무때나 보낼 수 있는게 아닙니다. 물론 비동기 소켓에서 연속된 send를 사용할 수 있습니다. 하지만, 안정적인 데이터 송수신을 기대 할 수 없죠. 그렇기 때문에 소켓은 데이터를 전송 할 수 있는 상태가 되었을 때 비로소 데이터를 전송해야 합니다.

len 매개변수를 0으로 해서 send 함수를 호출하는 것은 허용되고, 성공적으로 처리됩니다. 이러한 경우에는 send 함수는 0을 리턴합니다. 메시지 지향 소켓(message-oriented sockets)일경우는 0 길이의 데이터그램이 전송되어 집니다.

flag 매개변수는 소켓에 대해 명시된 옵션 이상의 함수동작에 영향을 미치기 위해서 사용될 수 있습니다. 함수의 의미체계는 소켓옵션 그리고, flag 매개변수에 의해서 결정되어 집니다. flag 매개변수를 이용한 방법의 경우 아래의 값을 OR 비트연산을 취해서 구성되어 집니다.

Value | Meaning
MSG_DONTROUTE | 데이터는 라우팅 될 수 없음을 나타냅니다. 윈도우즈 소켓 시스템은 대응하는 소켓옵션과 마찬가지로 이 값을 무시 할 수 있습니다.
MSG_OOB | 데이터가 out-of-band 데이터로서 전송될 수 있음을 나타냅니다. 이 플래그는 스트림 소켓과만 사용됩니다.

Return Values

에러가 발생하지 않는다면, send 함수는 전송된 총 데이터 크기를 반환합니다. 비동기 소켓의 경우 len 매개변수로 건넨 수치보다 작을 수 있습니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEACCES | 요청된 주소가 브로트캐스트(broadcast) 주소인데, 적절한 플래그가 셋팅되어 있지 않습니다. 브로드캐스트 어드레스의 사용을 허용하기 위해 SO_BROADCAST 매개변수를 가지고, setsockopt 함수를 호출 해야 합니다.
WSAEINTR | 블록킹 호출이 WSACancelBlockingCall 함수에서 취소되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEFAULT | buf 매개변수가 제대로 된 형태가 아닙니다.
WSAENETRESET | 연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.
WSAENOBUFS | 전송하기 위해 사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTCONN | 소켓이 접속된 상태가 아닙니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 가 명시되었지만, 소켓은 SOCK_STREAM 과 같은 형태의 스트림 형태가 아닙니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK | 소켓이 넌블록킹(비동기)로 마킹되어 있고, 수신 연산이 블록킹 상태입니다.
WSAEMSGSIZE | 소켓이 메시지 지향형(message oriented)이고, 메시지의 크기가 허용할 수 있는 최대 크기 보다 큽니다.
WSAEHOSTUNREACH | 네트웍 시스템 장애 등에 의해서 원격호스트까지 도달 할 수 없습니다.
WSAEINVAL | 소켓이 bind 함수에 의해서 바인드 되지 않았거나, 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE 옵션을 가능하게 한 상태 에서 MSG_OOB 플래그가 소켓에 대해서 명시되었습니다. 또는 len 매개변수가 0 이거나 0보다 작습니다.
WSAECONNABORTED | 가상 연결 회로망이 타임아웃이나 다른 실패 때문에 끊어져 버렸습니다.
WSAECONNRESET | 가상 회로망이 원격지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다.
WSAETIMEDOUT | 접속이 네트웍 실패나 상대방 시스템의 응답 실패로 인하여 드랍 되어 버렸습니다.

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

overview, recvfrom, select, sendto, socket, WSAAsyncSelect, WSAEventSelect


sendto

sendto 함수는 지정된 주소로 데이터를 전송하는 함수입니다.

int sendto (
SOCKET s,
const char FAR * buf,
int len,
int flags,
const struct sockaddr FAR * to,
int tolen
);

Parameters

s
[입력] 소켓의 기술자를 명시합니다.

buf
[입력] 전송될 데이터를 가지고 있는 버퍼

len
[입력] 버퍼 않에 있는 데이터의 길이

flags
[입력] 함수의 호출이 어떤일을 할지 나타내는 플래그 입니다.

to
[입력] 데이터가 전송될 원격 호스트의 어드레스를 나타냅니다.

tolen
[입력] to 매개변수의 크기

Remarks

sendto 함수는 소켓(접속 되었건 접속되지 않았건)에서 데이터를 접속된 상대방으로 전송하는데 사용되는 함수입니다. 메시지 지향 소켓(message-oriented sockets)에서 최대 패킷크기(getsockopt 함수로 SO_MAX_MSG_SIZE 옵션의 값을 얻어내서 최대 크기를 구할 수 있습니다.)를 초과하지 않도록 주의 해야 합니다. 만약 데이터가 전송되기에 너무 크다면, 데이터는 전송되지 않고, WSAEMSGSIZE 에러코드를 발생합니다.

to 매개변수는 소켓의 주소체계(address family)로 된 데이터가 전송될 원격 호스트의 어드레스를 나타냅니다. 물론, 브로드캐스트(broadcast) 또는 멀티캐스트 어드레스(multicast address)도 될 수 있습니다. 브로드캐스트 어드레스를 사용하여 전송할 경우 어플리케이션은 SO_BROADCAST 소켓옵션을 가능하게 하여 getsockopt 함수를 호출해야 합니다. getsockopt 함수를 이용하지 않고, 브로드캐스트 하려 한다면, sendto 함수는 실패로 돌아가고, WSAEACCES 에러코들 발생하게 됩니다. TCP/IP 에서, 어플리케이션은 그룹멤버(group member)가 되지 않고도 특정한 멀티캐스트 어드레스로 데이터를 전송할 수 있습니다.

소켓이 바인드 되지 않은 경우 유일한 값은 로컬 시스템에 의해서 할당되어 집니다. 그런다음 소켓은 바운드 된 것 처럼 마킹 됩니다. 이런 경우 어플리케이션은 로컬 소켓의 이름(name)을 얻기 위해 getsockname 함수를 사용할 수 있습니다.

send 함수의 성공적인 종료가 성공적인 데이터의 전송을 의미하지는 않는다는 점을 명심하세요.

sendto 함수는 일반적으로 접속되지 않은 소켓에 대해서, to 매개변수에 지정된 특정한 상대방 소켓으로 데이터그램을 전송하는데 사용하는 함수입니다. 하지만, 소켓(connectionless sockets : SOCK_DGRAM)이 이전에 특정한 주소로 접속되어 있다 하더라도, to 매개변수는 이전에 명시된 목적지 주소를 무시합니다. 접속지향소켓(connection-oriented socket)의 경우 to 와 tolen 매개변수는 무시되며, sendto 함수는 send 함수와 같은 작동을 하게 됩니다.

flag 매개변수는 소켓에 대해 명시된 옵션 이상의 함수동작에 영향을 미치기 위해서 사용될 수 있습니다. 함수의 의미체계는 소켓옵션 그리고, flag 매개변수에 의해서 결정되어 집니다. flag 매개변수를 이용한 방법의 경우 아래의 값을 OR 비트연산을 취해서 구성되어 집니다.

Value | Meaning
MSG_DONTROUTE | 데이터는 라우팅 될 수 없음을 나타냅니다. 윈도우즈 소켓 시스템은 대응하는 소켓옵션과 마찬가지로 이 값을 무시 할 수 있습니다.
MSG_OOB | 데이터가 out-of-band 데이터로서 전송될 수 있음을 나타냅니다. 이 플래그는 스트림 소켓과만 사용됩니다.

Return Values

에러가 발생하지 않는다면, send 함수는 전송된 총 데이터 크기를 반환합니다. 비동기 소켓의 경우 len 매개변수로 건넨 수치보다 작을 수 있습니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEACCES | 요청된 주소가 브로트캐스트(broadcast) 주소인데, 적절한 플래그가 셋팅되어 있지 않습니다. 브로드캐스트 어드레스의 사용을 허용하기 위해 SO_BROADCAST 매개변수를 가지고, setsockopt 함수를 호출 해야 합니다.
WSAEINVAL | 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE 옵션을 가능하게 한 상태 에서 MSG_OOB 플래그가 소켓에 대해서 명시되었습니다. 또는 len 매개변수가 0 이거나 0보다 작습니다.
WSAEINTR | 블록킹 호출이 WSACancelBlockingCall 함수에서 취소되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEFAULT | buf 매개변수가 제대로 된 형태가 아닙니다.
WSAENETRESET | 연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.
WSAENOBUFS | 전송하기 위해 사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTCONN | 소켓이 접속된 상태가 아닙니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 가 명시되었지만, 소켓은 SOCK_STREAM 과 같은 형태의 스트림 형태가 아닙니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK | 소켓이 넌블록킹(비동기)로 마킹되어 있고, 수신 연산이 블록킹 상태입니다.
WSAEMSGSIZE | 소켓이 메시지 지향형(message oriented)이고, 메시지의 크기가 허용할 수 있는 최대 크기 보다 큽니다.
WSAEHOSTUNREACH | 네트웍 시스템 장애 등에 의해서 원격호스트까지 도달 할 수 없습니다.
WSAECONNABORTED | 가상 연결 회로망이 타임아웃이나 다른 실패 때문에 끊어져 버렸습니다.
WSAECONNRESET | 가상 회로망이 원격지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다.
WSAEADDRNOTAVAIL | 원격지 주소가 올바를 형태가 아닙니다. 예를들어 ADDR_ANY와 같은 형태는 잘못된 형태입니다.
WSAEAFNOSUPPORT | 지정된 어드레스 체계가 이 소켓에서 사용될 수 없습니다.
WSAEDESTADDRREQ | 목적지 주소가 필요합니다.
WSAENETUNREACH | 웍격 시스템까지 네트웍이 도달할 수 없습니다.
WSAETIMEDOUT | 접속이 네트웍 실패나 상대방 시스템의 응답 실패로 인하여 드랍 되어 버렸습니다.

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

overview, recv, recvfrom, select, send, socket, WSAAsyncSelect, WSAEventSelect


SERVENT

struct servent {
char FAR * s_name;
char FAR * FAR * s_aliases;
short s_port;
char FAR * s_proto;
};

Members

s_name
서비스의 공식적인 이름

s_aliases
서비스 이름과 연관된(앨리어스 집단) 널로 끝나는 스트링 배열

s_port
서비스가 통신할 포트번호. 포트번호는 네트웍 바이트 오더입니다.

s_proto
서비스와의 통신에 사용될 프로토콜 이름을 지정합니다.

See Also

overview, HOSTENT, PROTOENT


setsockopt

setsockopt 함수는 소켓 옵션을 설정하는 함수입니다.

int setsockopt (
SOCKET s,
int level,
int optname,
const char FAR * optval,
int optlen
);

Parameters

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

level
[입력] 소켓 옵션 레벨이 정의 되며, SOL_SOCKET 과 IPPROTO_TCP 중 하나가 될 수 있습니다.

optname
[입력] 셋팅 하기위한 소켓옵션 값입니다.

optval
[입력] 검색된 옵션을 저장 하기위한 데이터 버퍼를 포인트 합니다.

optlen
[입력] optval 매개변수 버퍼의 크기

Remarks

setsockopt 함수는 지정된 소켓의 옵션을 특정한 형태(type), 상태(state)로 결합하기 위해서 지정한 소켓옵션 값을 셋팅하는 함수입니다. 비록 여러 프로토콜 레벨로의 소켓 옵션이 존재 할 순 있다 하더라도, 가장 우선하는 레벨이 존재하게 됩니다. 옵션은 소켓 연산에 영향을 미칩니다. 예를들어 발송된 데이터(OOB 데이터를 예로 들 수 있습니다) 를 일반 데이터 스트림으로 수신했을때나, 소켓으로 브로드캐스트(broadcast) 메세지를 전송할때 영향을 미치게 됩니다.

이 함수에서 사용 할 수 있는 두가지 형태의 소켓옵션이 있습니다. 활성화 또는 비활성화 시키기 위한 Boolean 옵션과, 정수형(integer) 또는 구조체를 요구하는 옵션이 있습니다. Boolean 옵션을 활성화 하기 위해서 optval 매개변수는 0이 아닌 정수를 포인트 하고, 비활성화 하기 위해서 0을 포인트 합니다. optlen 매개변수는 Boolean 옵션에 대해서는 sizeof(int)로 설정 해야만 합니다. 다른 옵션들에 대해서, optval 매개변수는 설정하고자 하는 정수(integer)나 구조체를 넘겨야 하고, optlen 매개변수는 정수(integer) 또는 구조체의 길이를 넘겨야 합니다. 아래에 setsockopt 함수에서 사용 할 수 있는 옵션들을 간단한 설명과 함께 나열 해 보았습니다.

level = SOL_SOCKET

옵션값(Value) | 데이터형태(Type) | 의미(Meaning)
SO_BROADCAST | BOOL | 소켓으로 브로드캐스트(broadcast) 메세지를 전송 할 수 있도록 합니다.
SO_DEBUG | BOOL | 디버깅 정보를 레코딩 합니다.
SO_DONTLINGER | BOOL | 소켓을 종료(close)할때 보내지지 않은 데이터를 보내기위해서 블럭킹 상태가 되지 않도록 합니다. 이 옵션을 셋팅하는 것은 LINGER 구조체의 멤버중 l_onoff를 0으로 셋팅하고 SO_LINGER 옵션을 셋팅 했을때와 같은 효력을 발휘합니다.
SO_DONTROUTE | BOOL | 라우팅 하지 않고, 직접 인터페이스로 보냅니다.
SO_GROUP_PRIORITY | int | 차후에 소켓그룹을 사용하기위해 예약 되어있습니다. 소켓그룹의 일부분인 소켓을 만들기위해 관련된 우선사항을 명시합니다. (우아아아악~ 정말 해석 못해 먹겠네여... 원문을 첨가 하겠습니다) Reserved for future use with socket groups. Specify the relative priority to be established for sockets that are part of a socket group.
SO_KEEPALIVE | BOOL | Keepalives를 전송합니다.
SO_LINGER | struct LINGER | 아직 전송되지 않은 데이터가 있을 경우 소켓을 종료(close)할때 대기합니다.
SO_OOBINLINE | BOOL | 일반 데이터 스트림(normal data stream)으로 out-of-band 데이터를 수신합니다.
SO_RCVBUF | int | 데이터를 수신하기 위한 총 버퍼공간을 명시합니다. 요놈은 SO_MAX_MSG_SIZE 나, TCP Window의 크기와 상관이 없습니다.
SO_REUSEADDR | BOOL | 이미 사용되고 있는 어드레스를 바인드 할 수 있도록 합니다.
SO_SNDBUF | int | 데이터를 전송하기 위한 총 버퍼공간을 명시합니다. 요놈은 SO_MAX_MSG_SIZE 나, TCP Window의 크기와는 상관이 없습니다.

level = IPPROTO_TCP

TCP_NODELAY
         BOOL

전송합병(send coalescing)을 위해 Nagle 알고리즘을 비 활성화 합니다.

Return Values

에러가 발생하지 않으면, setsockopt 함수는 0을 반환합니다. 에러가 발생하면, SOCKET_ERROR을 반환하면 WSAGetLastError 함수를 이용해서 특정 에러 코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | optval 또는 optlen 매개변수 중의 하나가 올바르지 않거나 optlen 매개변수의 값이 너무 작습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEINVAL | level 매개변수가 잘못됐거나, 알 수 없는 값 입니다.
WSAENETRESET | SO_KEEPALIVE가 설정 되었을때, 접속이 타입아웃 되었습니다.
WSAENOPROTOOPT | 알 수 없는 옵션이거나, 지원지지 않는 옵션을 사용 했습니다.
WSAENOTCONN | SO_KEEPALIVE가 설정 되었을때, 접속이 리셋 되었습니다.
WSAENOTSOCK | 기술자(descriptor)가 소켓 기술자가 아닙니다.

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

overview, bind, getsockopt, ioctlsocket, socket, WSAAsyncSelect, WSAEventSelect


제목없음

shutdown

shutdown 함수는 소켓에서의 송신이나 수신을 비활성화 하는데 사용하는 함수입니다.

int shutdown (
SOCKET s,
int how
);

Parameters

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

how
[입력] 셧다운될 오퍼레이션의 타입을 지정합니다.

Remarks

shutdown 함수는 수신, 전송, 또는 양쪽모두 비활성화 시키기 위해 사용됩니다.

how 매개변수가 SD_RECEIVE 이면, 나중에 호출될 recv 함수는 아무런 작동을 하지 않게 됩니다.
how 매개변수가 SD_SEND 라면, 나중에 호출될 send 함수는 비활성화 됩니다. 전송큐에 남아있는 데이터는 모두 전송됩니다.
how 매개변수가 SD_BOTH 라면, 전송과 수신 모두다 비활성화 됩니다.

shutdown 함수는 소켓을 닫지 않습니다. 그러므로 closesocket 함수가 해당 소켓에서 호출될 때까지 자원은 비워지지 않습니다.

소켓이 닫히기전에 모든 데이터를 보내고, 수신하도록 확실히 하기 위해서 어플리케이션은 closesocket 함수를 호출하기전에 shutdown 함수를 호출하여 접속을 해제 합니다. 우아한 접속종료를 하는 방법이 아래에 소개되어 있습니다. 참고하세요.

1. FD_CLOSE 이벤트를 등록하기 위해서 WSAAsyncSelect 함수를 호출합니다.

2. how=SD_SEND 로 shutdown 함수를 호출합니다.

3. FD_CLOSE 이벤트를 받았을 때 recv 함수를 0이 반환될 때 까지 또는 SOCKET_ERROR 가 반환 될 때 까지 호출합니다.

4. 자~ 이제 마지막으로 closesocket 함수를 호출 합니다.

Return Values

아무런 에러가 발생하지 않으면, shutdown 함수는 0을 반환 합니다. 에러가 발생한 경우는 SOCKET_ERROR 값이 반환 됩니다. 그리고 WSAGetLastError 함수를 이용해서 특정한 에러코드를 받을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEINVAL | how 매개변수가 잘못된 값입니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENOTCONN | 소켓이 접속된 상태가 아닙니다.(접속지향 소켓(connection-oriented sockets) 에서만)
WSAENOTSOCK | 기술자(descriptor)가 소켓이 아닙니다.

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

overview, connect , socket


SOCKADDR

SOCKADDR 구조체는 특정한 프로토콜에 종속되는 것이 아닙니다. sa_family 필드를 제외하고 SOCKADDR 구조체의 멤버는 네트웍바이트 오더로 표현됩니다. 해석이 좀 이상하져? 아래에 원문을 포함 하겠습니다.

The SOCKADDR structure varies depending on the protocol selected. Except for the sa_family field, SOCKADDR contents are expressed in network byte order.

무슨 말이냐구여? SOCKADDR 구조체는 다중 프로토콜을 지원하는 버클리 소켓의 원래 목표를 반영하는 의지를 담고있죠. 즉, SOCKADDR 구조체는 TCP/IP 프로토콜에서만 사용하는 구조체가 아닙니다. TCP/IP에 대한 어드레스 정보를 표현하기 위해서는 sa_family에 AF_INET 상수 값을 사용해야 하죠. 마찬가지로 ISO 어드레스 정보를 표현하기 위해서는 AF_ISO 상수 값에 의해서 확인됩니다. SOCKADDR 구조체의 나머지는 14 바이트의 정보이며, 이 정보의 구조는 sa_family 필드의 값에 따라 결정되게 됩니다.

struct sockaddr{
u_short
    sa_family;
char         sa_data[14];
};

SOCKADDR 구조체의 관리를 보다 더 쉽게 하기 위해 윈도우즈 소켓은 TCP/IP 어드레스와 작업할 때 SOCKADDR 구조체를 사용하는 것과 동일한 구조체인 SOCKADDR_IN을 선언해 놓고 있습니다.

이 구조체는 TCP/IP와 함께 사용됩니다. 다른 프로토콜은 이와 유사한 구조체를 사용합니다.

struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

See Also

overview, SOCKADDR_IN, IN_ADDR


SOCKADDR_IN

SOCKADDR_IN 구조체는 아래와 같은 형태를 가집니다.

struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

SOCKADDR_IN 구조체는 소켓이 접속해 있는 로컬 또는 원격지 주소를 표현하는데 사용됩니다. SOCKADDR_IN 구조체의 길이는 SOCKADDR 구조체의 길이와 동일합니다. 그러나 SOCKADDR_IN 구조체의 데이터 부분에 있는 필드들은 프로그램에 의한 관리가 가능할 정도로 명확하게 선언되어 있습니다. 일반적으로 프로그램은 변수를 SOCKADDR_IN 구조체로서 선언한 다음에 함수 호출 시 변수에 대한 포인터를 SOCKADDR 구조체로 캐스팅 해서 넘기는 방법을 주로 사용하고 있습니다.

Members

sin_family
주소 패밀리 (반드시 AF_INET이여야 합니다)

sin_port
네트웍 바이트 오더로 이루어진 포트 번호

sin_addr
네트웍 바이트 오더로 이루어진 아이피 번호

sin_zero
사용되지 않는 필드이며 0으로 설정될 수 있습니다. SOCKADDR에서 같의 위치의 같은 크기또한 사용하지 않습니다.

Comments

sin_addr 필드는 IN_ADDR 타입의 또 다른 구조체입니다. 프로그램은 IN_ADDR 구조체를 이용하여 IP 어드레스의 각 부분에 접근 할 수 있습니다. IN_ADDR 구조체는 윈도우즈 소켓 헤더 파일인 WINSOCK.H 에 다음과 같이 선언되어 있습니다.

struct   in_addr {
union {
struct
{
unsigned  char   s_b1,
s_b2,
s_b3,
s_b4;
}  S_un_b;

struct {
unsigned  short  s_w1,
s_w2;
}  S_un_w;

unsigned long  S_addr;
} S_un;
};

See Also

overview, SOCKADDR, IN_ADDR


제목없음

socket

socket 함수는 소켓을 만들고 소켓 기술자(descriptor)를 어플리케이션에 반환 하는 함수 입니다.

SOCKET socket (
int af,
int type,
int protocol
);

Parameters

af
[입력] 어드레스 체계(address family)를 결정합니다.

type
[입력] 소켓의 타입을 결정합니다.

윈도우즈 소켓 1.1에서는 두가지 종류의 타입을 제공합니다. 아래에 그 종류에 대해서 간단히 설명했습니다.

    Type | Explanation
SOCK_STREAM | 신뢰성있고, 접속지향적인, 하지만 느린, TCP 어드레스 체계에 사용됩니다.
SOCK_DGRAM | 비접속이고, 신뢰성없는 그러나 빠른, UDP 어드레스 체계에 사용됩니다.

protocol
[입력] 소켓과 함께 어느 프로토콜이 사용될 것인지 지정합니다.

Remarks

socket 함수는 소켓 기술자(descriptor)를 만들어내고, 관련되 리소스를 할당하고, 지정된 트랜스포트 서비스 프로바이더와 엮는 일을 합니다. 윈도우즈 소켓 시스템은 type, protocol 매개변수 그리고 어드레스 체계(af)와 부합하는 사용가능한 서비스 프로바이더를 사용할 것입니다. 새로 생성된 소켓은 기본적으로 중복된 속성을 가지게 될 것입니다. Microsoft 운영체제에서 MSWSOCK.H 에 정의 되어있는 Microsoft-specific 소켓 옵션은 이 기본속성에 영향을 줄 수 있습니다. 중복된 속성이 없는 소켓은 WSASocket 함수를 이용해서 생성할 수 있습니다. 중복연산을 허용하는 모든 함수(WSASend, WSARecv, WSASendTo, WSARecvFrom, 그리고 WSAIoctl)는 중복연산과 관련된 매개변수가 NULL일 경우 중복되지 않은 연산을 처리할 수 있도록 또한 지원됩니다.

af 매개변수는 AF_INET이나 AF_UNSPEC가 될 수 있는데, af 매개변수가 AF_UNSPEC 일 경우 protocol 매개변수를 반드시 지정해야 합니다.

SOCK_STREAM 과 같은 접속지향 소켓(connection-oriented sockets)은 양방향 접속을 지원하고, 어떤 데이터가 보내지고 수신되기 전에 접속된 상태가 되어 있어야만 합니다. 이러한 접속된 상태는 connect 함수를 호출해서 이룰 수 있습니다. 접속되었을 때 데이터는 send 그리고 recv 함수를 호출하여 전송 및 수신 할 수 있습니다. 소켓을 다 사용하고, 해제 할 때는 반드시 closesocket 함수가 수행 되어야 합니다.

비접속소켓, 즉, 메세지 지향 소켓(message-oriented sockets)은 sendto 그리고, recvfrom 함수를 이용해 상대방으로 부터의 데이터그램의 수신과 상대방으로의 데이터 송신을 수행 할 수 있습니다. 만약 이러한 소켓(메세지 지향 소켓) 특정한 원격지로 접속되어 있다면, 데이터그램은 send 그리고, recv 함수를 이용해 데이터그램을 전송 및 수신 할 수 있습니다.

Return Values

에러가 발생되지 않았다면, 소켓은 새로운 소켓의 기술자를 반환 합니다. 에러가 발생한 경우에는 INVALID_SOCKET을 반환하고, 특정한 에러코드를 WSAGetLastError 함수를 이용해서 얻을 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했거나 서비스 프로바이더에 에러가 발생 했습니다.
WSAEAFNOSUPPORT | 지정된 어드레스 체계가 지원되지 않습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEMFILE | 사용할 수 있는 소켓기술자가 바닥 나 있어서 소켓을 생성할 수 없습니다.
WSAENOBUFS | 사용할 수 있는 버퍼가 바닥 나 있어서 소켓을 생성할 수 없습니다.
WSAEPROTONOSUPPORT | 지정된 프로토콜이 지원되지 않는 형식입니다.
WSAEPROTOTYPE | 지정된 프로토콜이 잘못되었거나 이 소켓에 대해서 잘못된 형식입니다.
WSAESOCKTNOSUPPORT | 지정된 소켓 타입이 지정한 어드레스 체계에서 지원되지 않는 형식입니다.

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

overview, accept, bind, connect, getsockname, getsockopt, ioctlsocket, listen, recv, recvfrom, select, send, sendto, setsockopt, shutdown, WSASocket


TIMEVAL

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};

select ÇÔ¼ö¿¡¼ Å¸ÀÓ¾Æ¿ô °ªÀ¸·Î »ç¿ëµÇ´Â ±¸Á¶Ã¼·Î, BSD ÆÄÀÏÀÎ sys/time.h ·ÎºÎÅÍ °¡Á®¿Ô½À´Ï´Ù.


WSAAccept

WSAAccept 함수는 조건함수(condition function)의 반환값에 기반을 두어 접속을 조건적으로 허용하는 함수입니다.

SOCKET WSAAccept (
SOCKET s,
struct sockaddr FAR * addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondition,
DWORD dwCallbackData
);

Parameters

s
[입력] listen 함수를 호출해서 접속요청을 감지하기 위한 리슨소켓의 기술자

addr
[출력] 접속되는 대상에 대한 어드레스를 수신할 버퍼의 포인터 정확한 addr 매개변수의 형태는 소켓이 생성될 때 어드레스 집합(family)에 의해서 결정됩니다.

addrlen
[입력/출력] 어드레스를 얻어올 addr 의 길이를 가지고 있는 정수에 대한 포인터

lpfnCondition
[입력] 조건을 처리하는 프로시져에 대한 어드레스 포인터로써 어플리케이션은 호출자의 매개변수 정보를 바탕으로 하여 접속의 허용/해제를 결정하게될 조건함수를 제공하게 됩니다.

dwCallbackData
[입력] 콜백 데이터는 조건함수의 dwCallbackData 매개변수의 값으로 어플리케이션으로 전달됩니다. 이 매개변수는 윈도즈 소켓에 의해서 변환되지 않습니다.

Remarks

WSAAccept 함수는 소켓 s 에 접속을 위해 접속큐에 대기하고 있는 첫 번째 접속요청을 얻어내고, 지정된 조건함수에 맞은 접속요청을 체크하는 함수입니다. 만약 조건함수가 CF_ACCEP를 반환한다면, WSAAccept 함수는 새로운 소켓을 생성하고, 조건함수의 결과 매개변수 g 가 가리키는 소켓을 그룹핑하는 작업을 수행합니다. 새로 생성된 소켓은 WSAAsyncSelect 함수나 WSAEventSelect 함수로 비동기 이벤트가 등록된 소켓 s 와 같은 속성을 가지게 됩니다. 하지만, 리슨소켓의 그룹 아이디를 포함하지는 않습니다.

만약 조건 함수가 CF_REJECT를 반환한다면, WSAAccept 함수는 접속요청을 받아들이지 않게 됩니다. 조건함수는 WSAAccept 함수가 동작하는 쓰레드 상에서 수행되고, 가능한 빨리 그 결과를 반환 합니다. 만약 접속을 허용할 건지 아닌지 하는 판단을 바로 알아낼 수 없다면, 조건함수는 CF_DEFER 라고 하는 아직 결정이 나지 않았다 라는 값을 반환하게 됩니다. 이때 어떻한 액션도 일어나지 않습니다. 어플리케이션이 접속요구에 대해서 액션을 가져올 수 있도록 준비가 되었을 때, WSAAccept 함수는 다시한번 수행하고 CF_ACCEPT나 CF_REJECT 주에 하나가 조건함수로부터 반환되게 됩니다.

디폴트 모드(동기모드)상에서, 접속 대기 큐에 아무런 접속요청이 없을 때 이 함수를 호출하게 되면, 접속요구가 들어올 때 까지 어플리케이션을 블록킹 상태에 빠지게 될 것입니다. 반면에 비동기 모드 상에서 이와 똑같은 상황에서 WSAAccept 함수를 호출하게 되면, 소켓은 WSAEWOULDBLOCK 에러코드를 내면서 실패하게 됩니다. WSAAccept 함수가 성공적으로 수행되어, 새로운 소켓핸들을 반환하게 되겠죠? 이때 새로 생성되는 소켓은 다른 접속 요구를 받아들이는 소켓은 아닙니다. 머~ 당연한 거니까 굳이 부연설명은 달지 않겠습니다.

addr 매개변수는 통신계층에서 알 수 있는 형태의 접속정보에 대한 어드레스 결과를 얻어낼 매개변수입니다. addr 매개변수의 정확한 형태는 통신이 발생하는 어드레스 집합에 의해 결정됩니다. addrlen 매개변수는 함수 입력용으로 사용될 때는 addr 매개변수가 메모리상에 차지하는 크기를 가지도록 해서 넘겨야 합니다. 출력용으로 사용할 경우 이 값은 addr 매개변수에 실질적으로 포함된 어드레스의 길이(바이트)를 가지게 됩니다. 이 함수의 호출은 SOCK_STREAM과 같은 접속지향 소켓에서 사용됩니다. 만약 addr 이나 addrlen 이 NULL이라면, 접속된 소켓의 원격지 어드레스 정보는 얻어내지 못하게 됩니다.

조건함수(condition function)의 원형(prototype)은 아래와 같습니다.

int CALLBACK ConditionFunc(
IN LPWSABUF lpCallerId,
IN LPWSABUF lpCallerData,
IN OUT LPQOS lpSQOS,
IN OUT LPQOS lpGQOS,
IN LPWSABUF lpCalleeId,
OUT LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD dwCallbackData
);

프로토타입에 대한 설명은 생략 하겠습니다. 왜냐구요? 이제 번역하기가 힘드네요. 속이 다 메슥거려여. 언제 생각나면, 이어서 해야겠습니다. 완전 "無-책임" 의 극치를 달리는군요. 캬캬캬~

Return Values

함수가 성공적으로 수행되었다면, WSAAccept 함수는 접속허용된 소켓의 기술자를 가진 SOCKET 타입의 값을 반환 할 것입니다. 에러가 발생한 경우 INVALID_SOCKET을 반환할 것이고, WSAGetLastError 함수를 호출하여 특정한 에러코드를 검색 할 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAECONNREFUSED | 접속요구가 조건함수의 리턴값에 명시된 것(CF_REJECT) 처럼 강제적으로 허용하지 못하게 되어버렸습니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | addrlen 매개변수가 너무 작거나 addr 이나 lpfnCondition 공간이 제대로 할당되어 사용할 수 있는 영역이 아닙니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다.
WSAEINVAL | WSAAccept 함수를 호출하기 전에 먼저 성공적인 listen 함수가 수행되지 않았거나, 조건함수에 명시된 매개변수 g가 올바른 값이 아니거나, 하여튼 매개변수를 잘못써서 일어난 에럽니다.
WSAEMFILE | 사용가능한 소켓 기술자가 남아있지 않거나 사용할 수 있는 큐가 비어있지 않습니다.
WSAENOBUFS | 사용가능한 버퍼공간이 없습니다.
WSAENOTSOCK | 지정된 소켓이 올바른 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | 참고하도록 넘겨준 소켓이 접속지향형 타입의 소켓이 아닙니다.
WSATRY_AGAIN | 접속허용요구가 조건함수의 반환값(CF_DEFER)이 가리키는 것 처럼 바로 결과를 내어 줄 수 없어 연기되었다는 것을 의미합니다.
WSAEWOULDBLOCK | 비동기 소켓에서 접속을 요구한 소켓이 접속대기큐에 하나도 남아있지 않습니다.
WSAEACCES | 접속요구가 시간초과가 되었거나, 취소되었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, accept , bind, connect, getsockopt, listen, select, socket, WSAAsyncSelect, WSAConnect


WSAAsyncGetHostByAddr

WSAAsyncGetHostByAddr 함수는 지정된 주소에 일치하는 호스트 정보를 비동기적으로 얻어내는 함수입니다.

HANDLE WSAAsyncGetHostByAddr (
HWND hWnd,
unsigned int wMsg,
const char FAR * addr,
int len,
int type,
char FAR * buf,
int buflen
);

Parameters

hWnd
[입력] 비동기 작업 요청이 완료 되었을 때 메시지를 받을 윈도우의 핸들

wMsg
[입력] 비동기 작업 요청이 완료 되었을 때 수신하기위한 메시지

addr
[입력] 얻고자 하는 호스트에 대한 네트웍 어드레스에 대한 포인터입니다. 호스트 어드레스는 네트웍 바이트 오더(빅-인디언) 으로 저장됩니다.

len
[입력] 어드레스의 길이

type
[입력] 어드레스의 형태

buf
[출력] HOSTENT 데이터를 받기위한 데이터 영역의 포인터입니다. 이 데이터 영역은 HOSTENT 구조체보다 더 커야 합니다. 왜냐하면, 제공되는 데이터 영역은 HOSTENT 구조체와 HOSTENT 구조체의 모든 멤버 데이터 참조를 포함하기 위해 윈도우즈 소켓 시스템에서 사용되기 때문입니다. 즉, 제공된 버퍼가 데이터 베이스 룩업의 결과로서 만들어진 모든 데이터를 수신하기에 너무 짧을 경우 에러가 반환될 것입니다. 에러를 방지 하기 위해서 어플리케이션은 최소한 MAXGETHOSTSTRUCT 바이트 길이의 버퍼를 제공해야 합니다.

buflen
[입력] buf 매개변수의 크기를 나타냅니다.

Remarks

WSAAsyncGetHostByAddr 함수는 gethostbyaddr 함수의 비동기 버전이라고 생각하시면 됩니다. 이 함수는 지정되 네트웍 어드레스와 일치하는 어드레스 정보와 호스트네임을 얻고자 하는데 사용됩니다. 윈도우즈 소켓은 연산을 시작하고, 즉각 함수를 반환 하고, 어플리케이션은 비동기 작업(task) 식별자를 사용할 수 있습니다. 연산(operation)이 완료 되었을 때, 작업의 결과가 함수 호출시 지정했던 버퍼로 복사되고, 메시지가 어플리케이션 윈도우로 보내어 집니다.

비동기 연산이 완료 되었을 때, hWnd 매개변수로 지정된 어플리케이션 윈도우는 wMsg 매개변수로 지정된 메시지를 받습니다. wParam 매개변수는 원래 함수호출에 의해 반환된 비동기 작업(task) 핸들을 포함하고 있습니다. lParam 의 상위 16비트는 에러코드를 가지고 있습니다. 에러코드는 WINSOCK(2).H 헤더파일에 정의된 에러코드가 될 수 있습니다. 에러코드가 0 이면, 비동기 연산(operation)이 성공적으로 완료되었음을 가리킵니다.

성공적인 함수의 완료시, 함수 호출시 지정된 버퍼에는 HOSTENT 구조체를 가지고 있습니다. 이 구조체의 멤버에 접근하기 위해서는 원래 버퍼 메모리 주소를 HOSTENT 구조체의 포인터로 캐스팅 하고 적절히 접근 하면 됩니다.

만약 에러코드가 WSAENOBUFS 라면, buflen으로 지정된 버퍼의 크기가 모든 얻어낸 정보를 담기에 너무 작은 경우입니다. 이런 경우 lParam의 하위 16비트는 모든 정보를 수용할 수 있는 버퍼의 크기가 얼마인지 알려주게 됩니다. 만약 어플리케이션이 "이까짖 일부분 데이터는 필요없어!" 라고 판단한다면, 모든 정보를 받기에 충분한 크기로 버퍼를 셋팅하여 WSAAsyncGetHostByAddr 함수를 다시 호출 할 수 있습니다.

WSAENOBUFS 에러를 피하기 위해서 어플리케이션은 적어도 MAXGETHOSTSTRUCT 바이트(WINSOCK(2).H 에 정의되어 있음) 의 버퍼를 제공해야 합니다.

에러코드와 버퍼 길이는 WINSOCK2.H 파일에 정의된 WSAGETASYNCERROR 와 WSAGETASYNCBUFLEN 매크로를 사용해서 lParam 으로부터 뽑아낼 수 있습니다. 아래에 이 매크로에 대해서 간단히 나열해 보았습니다. 참고 하세요. 프로그램시 이들 매크로를 사용함으로써 윈도우즈 소켓 코드의 이식성(portability)을 향상 시킬 수 있다고 하네요.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

Return Values

반환값은 단지 비동기 연산이 성공적으로 시작하느냐 그렇지 않느냐를 나타냅니다. 이러한 비동기 연산의 경우 반환값으로 연산 자체의 성공이냐 실패냐를 결정할 순 없습니다.

에러가 발생하지 않은 경우, WSAAsyncGetHostByAddr 함수는 비동기 작업(task) 핸들(윈도우즈의 HTASK 과 헷갈리지 마세요)인 HANDLE 타입을 반환 합니다. 이 핸들값은 두가지 방법으로 사용될 수 있습니다. 첫 번째는 WSACancelAsyncRequest 함수를 호출하여 연산을 취소 시키는데 사용할 수 있고, 비동기 연산과 wParam 메시지 매개변수인 완료 메시지와 맞추어 보는데 사용될 수 있습니다.

만약 비동기 연산이 시작될 수 없었다면, WSAAsyncGetHostByAddr 함수는 0을 리턴하고, WSAGetLastError 함수를 이용하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 설정될 수 있습니다. 앞서 설명 했듯이, WSAGETASYNCERROR 매크로를 이용해서 응답 메시지인 lParam으로부터 에러코드를 뽑아낼 수 있습니다.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | addr 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 요청된 type(어드레스의 형태)를 찾을 수 없거나 잘못된 이름(name)입니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

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

overview, gethostbyaddr , HOSTENT, WSACancelAsyncRequest


WSAAsyncGetHostByName

WSAAsyncGetHostByName 함수는 지정된 호스트 이름과 일치하는 호스트 정보를 비동기적으로 얻어내는 함수 입니다.

HANDLE WSAAsyncGetHostByName (
HWND hWnd,
unsigned int wMsg,
const char FAR * name,
char FAR * buf,
 int buflen
);

Parameters

hWnd
[입력] 비동기적인 요청이 완료되었을 때 메시지를 수신할 윈도우의 핸들

wMsg
[입력] 비동기적인 요청작업이 완료되었을 때 수신될 메시지

name
[입력] 널 문자로 끝나는 호스트 이름

buf
[출력] HOSTENT 데이터를 수신하기 위한 데이터 영역의 포인터입니다. 이 데이터 영역은 HOSTENT 구조체의 크기보다 더 커야 합니다. 왜냐하면, 얻어지는 데이터 영역은 HOSTENT 구조체와 HOSTENT 구조체의 모든 멤버를 포함하기위하여 윈도우즈 소켓 시스템이 사용하기 때문입니다. 일반적으로 버퍼의 크기로 MAXGETHOSTSTRUCT를 사용합니다.

buflen
[입력] buf 매개변수를 위한 데이터 영역의 크기를 명시 합니다.

Remarks

WSAAsyncGetHostByName 함수는 gethostbyname 함수의 비동기 버전입니다. 이 함수는 지정된 호스트 이름과 일치하는 어드레스 정보를 얻어내기 위해서 사용됩니다. 윈도우즈 소켓 시스템은 연산을 시작하고, 함수는 바로 반환되고, 보이지 않게 백으로 연산을 수행합니다. "비동기 작업 핸들(asynchronous task handle)" 은 어플리케이션에서 연사의 식별자로 사용 할 수 있습니다. 연산(operation)이 완료 되었을 때 그 결과는 함수의 매개변수로 지정한 버퍼에 카피되고, 메시지는 어플리케이션 윈도우로 전달 됩니다.

비동기적인 연산이 완료 되었을 때 hWnd 매개변수로 지정된 어플리케이션 윈도우는 wMsg 매개변수인 메시지를 받게 됩니다. wParam 매개변수는 비동기 작업(task) 핸들을 가지는 매개변수입니다. lParam의 상위 16비트는 에러코드를 가지고 있습니다. 에러코드는 WINSOCK(2).H 헤더 파일에 정의된 에러코드가 될 수 있습니다. 에러코드가 0 일 경우 비동기 연산(operation)의 성공적인 완료를 의미합니다.

성공적인 완료시에 함수호출시에 지정한 버퍼는 HOSTENT 구조체를 가집니다. 이 구조체의 멤버를 접근하기위해서는 원래 버퍼 메모리 주소를 HOSTENT 구조체의 포인터로 캐스팅 하고나서 접근 할 수 있습니다.

만약 에러코드가 WSAENOBUFS 일 경우 buflen 매개변수에 의해서 지정된 버퍼의 크기가 결과로 얻은 정보를 담기에 너무 작다는 것을 의미합니다. 이런 경우 lParam 의 하위 16비트는 정보를 담기위해 필요한 버퍼의 크기를 나타내게 됩니다. 만약 어플리케이션이 이렇게 얻은 일부분 데이터가 필요없는 데이터라면, 원하는 정보를 담기위해서 충분한 버퍼의 크기를 설정하고 WSAAsyncGetHostByName 함수를 다시 호출 할 수 있습니다.

이 함수를 위하여 지정된 버퍼는 HOSTENT 구조체의 멤버에 의해서 참조되는 데이터 영역과 함께 HOSTENT 구조체를 구성하기위해 윈도우즈 소켓 시스템에서 사용됩니다. WSAENOBUFS 에러를 피하기 위해서는 어플리케이션에서 버퍼의 크기를 적어도 MAXGETHOSTSTRUCT(WINSOCK(2).H 헤더파일에 정의됨) 바이트의 크기만큼을 지정해야 합니다.

에러코드 그리고 버퍼의 길이는 lParam 으로부터 뽑아내야 합니다. 이 데이터를 뽑아내는데는 WINSOCK(2).H 헤더파일에 정의된 WSAGETASYNCERROR 매크로와 WSAGETASYNCBUFLEN 매크로가 사용됩니다. 아래에 이들 매크로를 간단히 나열 해 보았습니다. 프로그램시 이들 매크로를 사용함으로써 윈도우즈 소켓 코드의 이식성(portability)을 향상 시킬 수 있다고 하네요.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

Return Values

반환값은 단지 비동기 연산이 성공적으로 시작하느냐 그렇지 않느냐를 나타냅니다. 이러한 비동기 연산의 경우 반환값으로 연산 자체의 성공이냐 실패냐를 결정할 순 없습니다.

에러가 발생하지 않은 경우, WSAAsyncGetHostByName 함수는 비동기 작업(task) 핸들(윈도우즈의 HTASK 과 헷갈리지 마세요)인 HANDLE 타입을 반환 합니다. 이 핸들값은 두가지 방법으로 사용될 수 있습니다. 첫 번째는 WSACancelAsyncRequest 함수를 호출하여 연산을 취소 시키는데 사용할 수 있고, 비동기 연산과 wParam 메시지 매개변수인 완료 메시지와 맞추어 보는데 사용될 수 있습니다.

만약 비동기 연산이 시작될 수 없었다면, WSAAsyncGetHostByName 함수는 0을 리턴하고, WSAGetLastError 함수를 이용하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 설정될 수 있습니다. 앞서 설명 했듯이, WSAGETASYNCERROR 매크로를 이용해서 응답 메시지인 lParam으로부터 에러코드를 뽑아낼 수 있다는거져.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | name 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

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

overview, gethostbyname, HOSTENT, WSACancelAsyncRequest


WSAAsyncGetProtoByName

WSAAsyncGetProtoByName 함수는 지정된 프로토콜 이름과 일치하는 프로토콜 정보를 비동기적으로 얻어내는 함수 입니다.

HANDLE WSAAsyncGetProtoByName (
HWND hWnd,
unsigned int wMsg,
const char FAR * name,
char FAR * buf,
int buflen
);

Parameters

hWnd
[입력] 비동기적인 작업요청이 완료되었을 때, 메시지를 통지받을 윈도우의 핸들

wMsg
[입력] 비동기적인 작업 요청이 완료되었을 때, 수신받을 메시지

name
[입력] null 문자로 끝나는 프로토콜 이름 포인터

buf
[출력] PROTOENT 데이터를 수신하기 위한 데이터 영역 포인터입니다. 이 데이터 영역은 PROTOENT 구조체의 크기보다 더 커야 합니다. 왜냐믄... 데이터 영역데 PROTOENT 구조체와, PROTOENT 구조체의 모든 멤버들을 포함하기위해 윈도즈 소켓이 사용하기 때문입니다. 버퍼의 크기는 MAXGETHOSTSTRUCT byte 만큼의 크기가 주로 사용됩니다.

buflen
[출력] buf 매개변수를 위한 데이터 영역의 크기

Remarks

WSAAsyncGetProtoByName 함수는 getprotobyname 함수의 비동기 버전입니다. 이 함수는 주어진 프로토콜 이름과 부합하는 프로토콜 이름과 번호를 윈도즈 소켓 데이터베이스로부터 얻어냅니다. 이 함수를 호출하고 나면, 바로 함수는 리턴됩니다. 하지만, 데이터를 얻어내기 위한 연산은 비동기 태스크로 뒤에서 수행하고 있는 거죠. 어플레케이션은 이 비동기 태스크 핸들을 사용할 수 있습니다. 데이터를 얻어내는 연산과정이 끝나게 되면, 그 결과값은 함수를 호출할 때 넘겨주었던 buf에 저장되고 hWnd로 넘겨주었던 어플리케이션 윈도우로 작업을 다 수행 했다고 메시지를 주게 됩니다.

비동기 연산이 완료되었을 때, 어플레케이션 윈도우(hWnd)는 wMsg 으로 메시지를 수신받게 됩니다. wParam 매개변수는 원래 함수를 호출하고 바로리턴 받았던 것과 같은 비동기 태스크 핸들을 받게 됩니다. 굴구, lParam의 상위 16비트는 에러코드를 가지게 됩니다. 에러코드는 WINSOCK(2).H에 정의된 특정한 에러 코드가 됩니다. 만약 에러코드가 0 이라면, 비동기 작업이 성공적으로 완료 되었다는 것을 의미합니다.

성공적인 수행 후에, 맨첨 함수를 호출할 때 매개변수로 넘겨주었던 buffer 매개변수 있죠? 이 구조체를 접근하기 위해서는 원래 넘겨주었던 buffer 어드레스를 PROTOENT 구조체로 캐스팅 해야 합니다. 그런후에 적절히 멤버를 접근 해서 사용하면 됩니다.

만약 WSAENOBUFS 에러코드가 발생 했다면, buflen으로 지정한 buffer의 크기가 정보를 저장하기에 너무 작은 경우입니다. 이런 경우 lParam의 하위 16비트는 모든 정보를 담기위해 필요한 버퍼의 크기를 가지게 됩니다.

친절하게도 lParam으로부터 에러코드와 필요한 버퍼의 크기를 뽑아내는 매크로들을 준비해 놓고 있는게 있는데요. 아래의 것을이 그것입니다. 이 매크로들은 WINSOCK(2).H에 정의 되어 있습니다.
그저 HIWORD(...) 와 LOWORD(...)를 대신했다는 것 밖에는 특별한 점이 없습니다.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

이러한 매크로 들을 사용하면, 코드의 이식성이 좋아진다고 하네요? ^^

Return Values

리턴 값은 비동기 작업이 성공적이든 아니든 명시됩니다. 이 값은 연산 그자체의 성공이나 실패를 의미하지 않습니다.

아무런 에러가 발생되지 않았다면, WSAAsyncGetProtoByName 함수는 비동기 태스크 핸들인 HANDLE 타입인 0이 아닌 값을 반환 합니다. (태스크 핸들을 윈도즈 HTASK로 혼동하지는 마세요). 이 값은 두가지 용도로 사용할 수 있습니다. 그중하나는 WSACancelAsyncRequest 함수로 작업을 취소 할 때 사용할 수 있고요, 또... 작업을 성공적으로 완료 했을 때 메시지가 오죠? 그때 wParam 메시지 매개변수와 비교해서 특정한 비동기 작업을 구분해 낼 수도 있습니다.

만약 비동기 연산이 성공적으로 시작되지 못했다면, WSAAsyncGetProtoByName 함수는 0을 리턴 합니다. 그리고, WSAGetLastError 함수의 호출로 특적한 에러코드를 얻어낼 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 설정될 수 있습니다. 앞서 설명 했듯이, WSAGETASYNCERROR 매크로를 이용해서 응답 메시지인 lParam으로부터 에러코드를 뽑아낼 수 있다는거져.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | name 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, getprotobyname, WSACancelAsyncRequest


WSAAsyncGetProtoByNumber

WSAAsyncGetProtoByNumber 함수는 비동기적으로 지정된 프로토콜 번호와 일치하는 프로토콜 정보를 반환하는 함수입니다.

HANDLE WSAAsyncGetProtoByNumber (
HWND hWnd,
unsigned int wMsg,
int number,
char FAR * buf,
int buflen
);

Parameters

hWnd
[입력] 비동기적인 작업요청이 완료되었을 때 메시지를 수신받을 윈도우의 핸들

wMsg
[입력] 비동기 작업요청이 완료 되었을 때 수신받을 메시지

number
[입력] 정보를 얻고자 하는 프로토콜 번호(호스트 바이트 오더)

buf
[출력] PROTOENT 데이터를 받기위한 데이터 영역 포인터입니다. 이 데이터 영역은 PROTOENT 구조체 보다 더 커야 합니다. 왜냐믄... 데이터 영역은 윈도즈 소켓에서 PROTOENT 구조체와 PROTOENT 구조체의 모든 멤버 데이터를 포함하는데 사용되기 때문입니다. 이 버퍼의 크기는 보통 MAXGETHOSTSTRUCT 바이트 크기를 사용합니다.

buflen
[입력] buf 매개변수에 대한 데이터 영역의 크기

Remarks

WSAAsyncGetProtoByNumber 함수는 getprotobynumber 함수의 비동기 버전입니다. 즉, 지정된 프로토콜 번호와 부합하는 프로토콜 이름과 번호를 반환하는 함수죠. 윈도즈 소켓은 함수를 호출했을 때 바로 연산을 시작하고 바로 함수를 리턴하게 됩니다. 실제적인 작업은 비동기 대스크로 빽으로 보이지 않게 수행되게 됩니다. 연산이 완료되었을 때, 결과는 함수를 호출할 때 넘겼던 buffer로 카피되게 되고, 메시지는 어플리케이션 윈도우로 전달되게 됩니다.

비동기 연산이 완료 되었을 때, hWnd 매개변수로 지정된 어플리케이션 윈도우는 wMsg 매개변수로 지정된 메시지를 받게 됩니다. wParam 매개변수는 원래 첨에 함수를 호출할 때 리턴값으로 얻을 수 있었던 것과 같은 비동기 태스크 핸들을 의미합니다. lParam 의 상위 16비트는 특정한 에러코드를 의미하는데, 이 에러코드는 WINSOCK(2).H에 정의 되어 있는 에러코드중 하나가 될 수 있습니다. 에러코드가 0 일때, 비동기 연산작업은 성공적으로 이루어 졌다고 볼 수 있습니다.

성공적으로 완료되었을 때, 원래 함수 호출시 넘겨주었던 buffer로 PROTOENT 구조체를 포함하는 정보가 저장되게 되죠. 이 구조체의 멤버를 접근하기 위해서 오리쥐날 buffer 어드레스를 PROTOENT 구조체로 변환하는 캐스팅 작업이 필요 합니다. 그런 다음에 이 데이터를 사용할 수 있게 됩니다.

WSAENOBUFS 에러코드가 발생한 경우는 함수를 호출할 때 buflen 으로 넘겨주었던 buffer의 크기가 결과로 나온 정보를 모두 담기에 너무 작은 경우를 의미합니다. 이러한 경우 lParam의 하위 16비트가 필요한 버퍼의 크기를 가리키게 되므로 얼마정도의 크기를 원하는지 알 수 있습니다.

결국 중요한 점은 함수를 호출할 때 넘겨주었던 buffer에 윈도즈 소켓이 PROTOENT 구조체를 포함하는 정보를 저장하므로 적어도 MAXGETHOSTSTRUCT 바이트 만큼의 크기는 넘겨주어야 한다는 점입니다. 꼭 기억 하시기 바랍니다.

이러한 에러코드와 필요한 버퍼의 길이와 같은 데이터는 WINSOCK(2).H 에 선언되어 있는 아래의 매크로를 사용해 뽑아낼 수 있습니다.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

이러한 매크로를 사용하면, 코드의 이식성이 좋아진다고 합니다.

Return Values

리턴값은 비동기적인 연산이 성공했든 아니든간에 반환됩니다. 이 리턴값 그자체로는 연산이 정상적으로 수행되었는지 아닌지를 결정할 수는 없습니다.

만약 아무런 에러가 발생하지 않았다면, WSAAsyncGetProtoByNumber 함수는 0이 아닌 비동기 태스크 핸들을 반환 합니다(윈도즈 HTASK와 헷갈리지 마세요). 이 비동기 태스크 핸들은 두가지 용도로 사용될 수 있습니다. 첫 번째로 WSACancelAsyncRequest 함수에 사용해서 작업중이 연산을 중지 시킬 수 있고, 두 번째로 연산이 완료되었을 때 메시지를 받는 루틴에서 wParam과, 이 비동기 태스크 핸들을 비교해서 어떤 작업의 완료 메시지 인지를 비교해서 추출해 낼 수 도 있는거죠.

만약 비동기 연산이 초기화되고 시작되지 못했다면, WSAAsyncGetProtoByNumber 함수는 0값을 반환 하고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 반환 할 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 얻어낼 수 있는 에러코드입니다. 다시말하면, 수신된 메시지중 lParam 매개변수를 WSAGETASYNCERROR 매크로를 사용해서 뽑아낼 수 있는 값입니다.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | name 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, getprotobynumber, WSACancelAsyncRequest


WSAAsyncGetServByName

WSAAsyncGetServByName 함수는 지정된 서비스 이름, 프로토콜과 부합하는 서비스 정보를 반환하는 함수 입니다.

HANDLE WSAAsyncGetServByName (
HWND hWnd,
unsigned int wMsg,
const char FAR * name,
const char FAR * proto,
char FAR * buf,
int buflen
);

Parameters

hWnd
[입력] 비동기 작업이 완료 되었을 때 메시지를 수신받을 윈도우의 핸들

wMsg
[입력] 비동기 작업이 완료 되었을 때 수신받을 메세지

name
[입력] null 문자로 끝나는 서비스 이름 스트링

proto
[입력] 프로토콜 이름에 대한 포인터. 이 값은 WSAAsyncGetServByName 함수가 주어진 name과 일치하는 s_name이나 s_aliases에 대해서 첫 번째 서비스 엔트리만을 검색할 경우 NULL이 될 수 있습니다. 그렇지 않은 경우 즉, proto가 NULL이 아닌경우 WSAAsyncGetServByName 함수는 name 과 proto 양쪽 모두와 일치하는 서비스 정보를 반환하게 됩니다.

buf
[출력] SERVENT 데이터를 수신하기 위한 데이터 영역 포인터. 이 데이터영역은 SERVENT 구조체의 크기보다 더 커야 합니다. 왜냐믄, 이 데이터 영역을 윈도즈 소켓이 SERVENT 구조체와 SERVENT 구조체의 멤버를 참조하는 데이터 전부를 포함해야 하기 때문입니다. 구래서 보통 MAXGETHOSTSTRUCT 바이트 만큼의 버퍼를 주로 사용합니다.

buflen
[입력] buf 매개변수에 대한 데이터 영역의 크기

Remarks

WSAAsyncGetServByName 함수는 getservbyname 함수의 비동기 버전이라 할 수 있습니다. 즉, 지정된 서비스 이름과 부합하는 서비스 정보를 반환하는데 사용되는 함수입니다. 함수를 콜하게 되면, 바로 비동기 연산이 시작되게 되고 비동기 연산은 빽~ 으로 눈에 보이지 않게(?) 동작하게 됩니다. 이 비동기 연산에 대한 태스크 핸들이 본 함수의 리턴값으로 넘어오게 되는데 어플리케이션에서는 이 태스크 핸들을 사용 할 수 있습니다. 비동기 연산이 완료 되었을 때 그 결과는 함수의 호출지 제공되었던 buffer로 카피되고 어플리케이션 윈도우로 메시지가 보내지게 됩니다.

비동기 연산이 완료되었을 때, hWnd로 지정되었던 어플리케이션 윈도우는 wMsg로 지정되었던 메시지를 수신하게 됩니다. wParam 매개변수는 이전에 함수를 호출할 때 리턴되었던 핸들과 같은 비동기 태스크 핸들을 가지고 있습니다. lParam의 상위 16비트는 특정한 에러코드를 가지고 있는데, 이 에러코드는 WINSOCK(2).H에 정의된 특정한 에러코드가 될 수 있습니다. 만약 이 lParam의 상위 16비트인 에러코드가 0일 경우 비동기 연산은 성공했다고 볼 수 있습니다.

성공적인 수행 후에, 함수호출시 제공되었던 buffer는 SERVENT 구조체를 가지게 됩니다. 이 구조체의 멤버를 접근하려면, 먼저 buffer 어드레스를 SERVENT 구조체로 캐스팅하고, 멤버를 접근하면 됩니다.

만약 WSAENOBUFS 에러코드가 발생한 경우 함수의 호출시 넘겨주었던 buflen의 크기인 buffer가 모든 정보를 담기에 너무작은 경우입니다. 이런 경우 lParam의 하위 16비트는 모든 정보를 담기에 충분한 버퍼의 크기를 가르쳐 주게 되죠. 즉, lParam의 하위 16비트 크기만큼의 버퍼를 할당해야지만, 정상적인 정보를 얻어낼 수 있다는 의미입니다.

lParam에 포함되어 있는 에러코드와 버퍼의 길이는 WSAGETASYNCERROR 과 WSAGETASYNCBUFLEN 매크로를 이용해서 뽑아낼 수도 있습니다.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

이러한 매크로를 이용하면, 코드의 이식성이 좋아진다고 합니다.

Return Values

리턴값은 비동기적인 연산이 성공했든 아니든간에 반환됩니다. 이 리턴값 그자체로는 연산이 정상적으로 수행되었는지 아닌지를 결정할 수는 없습니다.

만약 아무런 에러가 발생하지 않았다면, WSAAsyncGetProtoByNumber 함수는 0이 아닌 비동기 태스크 핸들을 반환 합니다(윈도즈 HTASK와 헷갈리지 마세요). 이 비동기 태스크 핸들은 두가지 용도로 사용될 수 있습니다. 첫 번째로 WSACancelAsyncRequest 함수에 사용해서 작업중이 연산을 중지 시킬 수 있고, 두 번째로 연산이 완료되었을 때 메시지를 받는 루틴에서 wParam과, 이 비동기 태스크 핸들을 비교해서 어떤 작업의 완료 메시지 인지를 비교해서 추출해 낼 수 도 있는거죠.

만약 비동기 연산이 초기화되고 시작되지 못했다면, 이 함수는 0값을 반환 하고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 반환 할 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 얻어낼 수 있는 에러코드입니다. 다시말하면, 수신된 메시지중 lParam 매개변수를 WSAGETASYNCERROR 매크로를 사용해서 뽑아낼 수 있는 값입니다.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | name 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, getservbyname, WSACancelAsyncRequest


WSAAsyncGetServByPort

WSAAsyncGetServByPort 함수는 지정된 포트와 프로토콜과 부합하는 서비스 정보를 얻어내는 함수입니다.

HANDLE WSAAsyncGetServByPort (
HWND hWnd,
unsigned int wMsg,
int port,
const char FAR * proto,
char FAR * buf,
int buflen
);

Parameters

hWnd
[입력] 비동기 작업이 완료 되었을 때 메시지를 수신받을 윈도우의 핸들

wMsg
[입력] 비동기 작업이 완료 되었을 때 수신받을 메시지

port
[입력] 서비스 포트번호, 네트웍 바이트 오더로 넘겨 줍니다.

proto
[입력] 프로토콜 이름에 대한 포인터를 넘겨줍니다. 이값은 port 매개변수 하나로만, 서비스 정보를 얻고자 할 때, NULL이 될 수 있습니다. 만약 proto 매개변수를 NULL이 아닌 값으로 넘겨주에 되면, WSAAsyncGetServByPort 함수는 port와 proto 양쪽다 일치하는 서비스 정보를 반환 하게 됩니다.

buf
[출력] SERVENT 데이터를 수신받을 데이터 영역에 대한 포인터. 이 데이터 영역은 SERVENT 구조체의 크기보다 더 커야 합니다. 왜냐믄, 넘겨준 데이터 영역은 SERVENT구조체와 그외 모든 데이터를 가지도록 윈도즈 소켓이 사용하기 때문입니다. 일반적으로 MAXGETHOSTSTRUCT 바이트 크기의 버퍼를 사용합니다.

buflen
[입력] buf 매개변수에 대한 데이터 영역의 크기

Remarks

WSAAsyncGetServByPort 함수는 getservbyport 함수의 비동기 버전입니다. 이 함수는 port 번호와 부합하는 서비스 정보를 얻어냅니다. 함수를 호출하게 되면, 윈도즈 소켓은 연산을 시작하게되고, 즉각 함수는 반환됩니다. 즉, 블록킹되지 않는다는 의미죠. 비동기 연산은 빽~ 으로 보이지 않게 수행됩니다. 이렇게 바로 함수가 반환 할 때 주는 리턴값은 비동기 태스크 핸들입니다. 어플리케이션에서는 이값을 다른 작업을 하는데 사용 할 수 있습니다. 비동기 연산이 끝나게 되면, 함수를 호출할 때 넘겨주었던 버퍼에 서비스 정보가 카피되게 됩니다. 그리고, 지정된 어플리케이션 윈도우로 메시지가 보내지게 됩니다.

비동기 작업이 완료 되었을 때, hWnd로 지정되었던 어플리케이션 윈도우는 wMsg 로 지정되었던 메시지를 수신받게 됩니다. wParam 매개변수는 비동기 태스크 핸들을 가지게 됩니다. 이 태스크 핸들은 함수를 호출했을 때 리턴받은 핸들과 같은 핸들입니다. lParam의 상위 16비트는 WINSOCK(2).H에 정의되어 있는 특정한 에러코드가 될 수 있습니다. 만약 에러코드가 0이라면, 비동기 작업이 에러없이 성공적으로 수행되었음을 의미합니다.

성공적인 수행 후에, 함수호출시 제공되었던 buffer는 SERVENT 구조체를 가지게 됩니다. 이 구조체의 멤버를 접근하려면, 먼저 buffer 어드레스를 SERVENT 구조체로 캐스팅하고, 멤버를 접근하면 됩니다.

만약 WSAENOBUFS 에러코드가 발생한 경우 함수의 호출시 넘겨주었던 buflen의 크기인 buffer가 모든 정보를 담기에 너무작은 경우입니다. 이런 경우 lParam의 하위 16비트는 모든 정보를 담기에 충분한 버퍼의 크기를 가르쳐 주게 되죠. 즉, lParam의 하위 16비트 크기만큼의 버퍼를 할당해야지만, 정상적인 정보를 얻어낼 수 있다는 의미입니다.

lParam에 포함되어 있는 에러코드와 버퍼의 길이는 WSAGETASYNCERROR 과 WSAGETASYNCBUFLEN 매크로를 이용해서 뽑아낼 수도 있습니다.

#define WSAGETASYNCERROR(lParam)                     HIWORD(lParam)
        //에러코드 검색
#define WSAGETASYNCBUFLEN(lParam)                   LOWORD(lParam)
        //필요한 버퍼의 길이 검색

이러한 매크로를 이용하면, 코드의 이식성이 좋아진다고 합니다.

Return Values

리턴값은 비동기적인 연산이 성공했든 아니든간에 반환됩니다. 이 리턴값 그자체로는 연산이 정상적으로 수행되었는지 아닌지를 결정할 수는 없습니다.

만약 아무런 에러가 발생하지 않았다면, WSAAsyncGetProtoByPort 함수는 0이 아닌 비동기 태스크 핸들을 반환 합니다(윈도즈 HTASK와 헷갈리지 마세요). 이 비동기 태스크 핸들은 두가지 용도로 사용될 수 있습니다. 첫 번째로 WSACancelAsyncRequest 함수에 사용해서 작업중이 연산을 중지 시킬 수 있고, 두 번째로 연산이 완료되었을 때 메시지를 받는 루틴에서 wParam과, 이 비동기 태스크 핸들을 비교해서 어떤 작업의 완료 메시지 인지를 비교해서 추출해 낼 수 도 있는거죠.

만약 비동기 연산이 초기화되고 시작되지 못했다면, 이 함수는 0값을 반환 하고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 반환 할 수 있습니다.

Error Codes

아래의 에러코드는 어플리케이션 윈도우가 메시지를 받았을 때 얻어낼 수 있는 에러코드입니다. 다시말하면, 수신된 메시지중 lParam 매개변수를 WSAGETASYNCERROR 매크로를 사용해서 뽑아낼 수 있는 값입니다.

WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAENOBUFS | 사용가능한 버퍼 공간이 부족합니다.
WSAEFAULT | name 또는 buf 매개변수가 처리를 하기에 올바를 형태가 아닙니다.
WSAHOST_NOT_FOUND | 정당한(Authoritative) 호스트를 찾아낼 수 없습니다.
WSATRY_AGAIN | 정당하지 않은(Non-Authoritative)를 찾을 수 없습니다. 또는 서버실패 입니다.
WSANO_RECOVERY | 회복할 수 없는 에러발생
WSANO_DATA | 잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

아래의 에러코드는 본 함수를 호출 했을 때 발생될 수 있는 에러코드입니다. 그리고, 이러한 에러코드가 검출 되었을 때 비동기 연산은 시작 될 수 없다는 것을 의미합니다.

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEWOULDBLOCK | 비동기 연산이 리소스나 다른 반대적인 요소들 때문에 진행될 수 없습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, getservbyport, WSACancelAsyncRequest


WSAAsyncSelect

WSAAsyncSelect 함수는 지정된 소켓에 대해서 특정한 네트웍 이벤트에 대한 윈도즈 통지 메시지를 받을 것인지 않받을 것인지 설정하는 함수입니다. - 좀 양이 많네요^^ 그래두 중요한 부분이니까 꼭 숙지 하도록 해요.

int WSAAsyncSelect (
SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent
);

Parameters

s
[입력] 이벤트 통지를 설정할 대상 소켓 기술자

hWnd
[입력] 네트웍 이벤트가 발생 했을 때 메시지를 수신할 윈도즈 핸들

wMsg
[입력] 네트웍 이벤트가 발생했을 때 수신될 메시지

lEvent
[입력] 어플리케이션이 수신할 네트웍 이벤트의 비트조합

Remarks

WSAAsyncSelect 함수는 WS2_32.DLL 이 IEvent 매개변수에 의해 지정된 네트웍 이벤트가 발생했을대 마다 hWnd 윈도우로 메시지를 보내야 할 때 사용됩니다. 보내야 하는 메시지는 wMsg 매개변수로 지정한 메시지가 되고, 통지받는 대상 소켓은 s 매개변수에 의해서 지정된 소켓입니다.

WSAAsyncSelect 함수는 IEvent 값에 개의치 않고, 소켓 s 를 비동기 모드로 자동적으로 설정합니다. 동기모드에서 비동기 모드로 설정하는 방법에 대해 알고 싶으면, ioctlsocket 함수를 참조하도록 하세요.

IEvent 매개변수는 아래 리스트에 보이는 값들을 OR 비트연산 해서 구성된 값으로 이루어 집니다.

Value | Meaning
FD_READ | 데이터 수신 통지메시지를 수신 하려할때.
FD_WRITE | 데이터 전송이 준비가 되었다는 통지메시지를 수신하려 할 때
FD_OOB | out-of-band 데이터가 수신되었다는 통지메시지를 수신하려 할때
FD_ACCEPT | 접속 요구가 들어왔다는 통지메시지를 수신하려 할때
FD_CONNECT | 접속이나, multi-point join 작업이 완료되었다는 통지메시지를 수신하려 할 때
FD_CLOSE | 연결된 상대방 소켓이 종료되었다는 통지메시지를 수신하려 할 때
FD_QOS | Socket Quality of Service(QOS)가 변경되었다는 메시지를 수신하려 할 때
FD_GROUP_QOS | Socket Group Quality of Service(QOS)가 변경되었다는 메시지를 수신하려 할 때
FD_ROUTING _INTERFACE_CHANGE | 지정된 목적지(들)에 대해서 경로배정 인터페이스가 변경되었다는 메시지를 수신하려 할 때.
FD_ADDRESS_LIST _CHANGE | 소켓의 프로토콜 집합에 대한 로컬 어드레스 리스트가 변경되었다는 메시지를 수신하려 할 때.

간단한 사용법을 한번 알아 볼까요? 데이터의 수신과 송신 통지 메시지를 수신하기 위해서는 FD_READ 그리고, FD_WRITE를 비트연산자로 합쳐서 WSAAsyncSelect 함수를 호출하게 됩니다. 아래와 같이 말이죠.

rc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE);

WSAAsyncSelect 함수를 지정된 IEvent 를 가지고 호출하게 되면, 이전에 동일한 소켓에 대해서 WSAAsyncSelect 함수나 WSAEventSelect 함수로 설정되어 있던 메시지 이벤트는 무시됩니다. 새로 설정된 메시지 이벤트가 영향력을 미치게 되는 것이죠. 아래의 코드에서는 s 소켓에 대해서 wMsg2 메시지로 FD_WRITE 이벤트만이 발생하게 됩니다.

rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);

소켓에 대해 설정되어있는 모든 네트웍 통지메세지를 앞으로 수신받지 않으려면, IEvent 를 0으로 셋팅하면, 됩니다.

rc = WSAAsyncSelect(s, hWnd, 0, 0);

WSAAsyncSelect 함수가 소켓에 대한 이벤트 메시지를 바로 비활성화 시킬지라도, 메시지가 어플리케이션의 메시지 큐에서 대기하도록 하는 것은 가능합니다. 따라서 어플리케이션은 취소작업후에 네트웍 이벤트 메시지를 수신받기위해 준비해야 합니다. closesocket 함수로 소켓을 닫는겨우 역시 WSAAsyncSelect 메시지 전송을 취소 하지만, 큐에 남아있던 메시지는 없어지지 않고 여전히 남아있게 됩니다.

accept 함수로 생성된 소켓은 이 소켓을 접속허용 하는데 사용되었던 리슨소켓(listen socket)과 같은 속성을 가지게 됩니다. 그 결과로 리슨소켓에 WSAAsyncSelect 로 셋팅되었던 이벤트는 접속허용된 소켓에 그대로 적용됩니다. 한 예로, 리슨소켓이 FD_ACCEPT, FD_READ, 그리고 FD_WRITE 이벤트를 가지고 있다면, 이 리슨소켓으로 접속허용된 소켓 또한 역시 FD_ACCEPT, FD_READ, 그리고 FD_WRITE 속성을 가지게 된다는 거져. 만약 새로 접속허용된 소켓에 대해서 다른 wMsg 와 이벤트를 적용시키고 싶다면, WSAAsyncSelect 함수를 사용해서 새로운 적절한 이벤트 정보를 다시 설정해야 합니다.

등록된 네트웍 이벤트가 지정된 소켓 s 에 대해서 발생했을 때, 어플리케이션 윈도우 hWnd 는 wMsg 메시지를 수신받게 됩니다. wParam 매개변수는 네트웍 이벤트가 발생한 소켓을 의미합니다. lParam의 하위 16비트는 발생된 네트웍 이벤트를 의미하고, lParam의 상위 16비트는 특정한 에러코드를 의미합니다. 에러코드는 WINSOCK(2).H에 정의된 에러코드 입니다.

이벤트 통지 메시지를 사용하는 방법에서, WSAGetLastError 함수는 에러값을 체크하는데 사용할 수 없습니다. 왜냐믄, WSAGetLastError 함수의 리턴값이 lParam의 상위 16비트와 다를 수 있기 때문입니다.

에러코드와 이벤트코드는 WSAGETSELECTERROR와 WSAGETSELECTEVENT 매크로를 사용해서 lParam으로부터 뽑아낼 수 있습니다. 이 매크로는 WINSOCK(2).H에 정의되어 있습니다.

#define WSAGETSELECTERROR(lParam) HIWORD(lParam)
#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)

이러한 매크로를 사용하면, 코드의 이식성이 좋아진다고 합니다.

사용가능한 네트웍 이벤트 코드를 아래에 리스팅 했습니다. 참고 하세요.

Value | Meaning
FD_READ | 데이터를 수신 할 수 있는 상태가 되었당.
FD_WRITE | 데이터를 전송 할 수 있는 상태가 되었당.
FD_OOB | out-of-band 데이터를 수신할 수 있는 상태가 되었당.
FD_ACCEPT | 새로운 접속 요구를 허용할 준비가 되었당.
FD_CONNECT | 접속 또는 multi-point join 연산이 완료되었당.
FD_CLOSE | 연결된 상태방 소켓이 종료 했당.
FD_QOS | Socket Quality Of Service 가 변경되었당.
FD_GROUP_QOS | Socket Group Quality of Service(QOS)가 변경되었당
FD_ROUTING _INTERFACE_CHANGE | 지정된 목적지(들)에 대해서 경로배정 인터페이스가 변경되었당.
FD_ADDRESS_LIST _CHANGE | 소켓의 프로토콜 집합에 대한 로컬 어드레스 리스트가 변경되었당.

WSAAsyncSelect 함수는 데이터 전송/수신 연산(send 또는 recv)을 성공적으로 할 수 있을 때를 결정하는데 주로 사용됩니다. 이렇게 사용되는 경우, 튼튼한 어플리케이션을 만들려면, WSAEWOULDBLOCK이 발생될 수 있는 상황에 대해서 철저한 준비를 해야합니다. 한 예로 아래와 같은 상황이 일어 날 수도 있습니다.

1. 데이터가 소켓 s 에 도착했습니다... 삐리비리빅~
이때 윈속은 메시지를 포스팅 합니다.

2. 이때 어플리케이션은 몇몇 다른 메시지를 처리하고 있습니다.

3. 처리하고 있는동안에 어플리케이션이 ioctlsocket( s, FIONREAD...)를 호출하고, 소켓에 읽을 수 있는 데이터가 있다는 것을 알아냅니다.

4. 어플리케이션은 recv( s, ...)를 호출하여 데이터를 읽습니다.

5. 1.에서 이미 수신된 메시지를 post했었죠? 즉, 메시지 큐에 메시지는 남아있게 되므로 데이터를 읽을 수 있는상태라는 FD_READ 가 발생합니다.

6. 어플리케이션은 recv( s, ... )를 호출하겠죠? 하지만, WSAEWOULDBLOCK 에러가 발생하게 됩니다.

윈도즈 소켓은 특정한 네트웍 이벤트 메시지로 어플리케이션 윈도우로 항상 메시지를 주지 않습니다. 이러한 어플리케이션 윈도우로의 이벤트의 통보는, 어플리케이션이 네트웍 이벤트의 암시적 재활성화(re-enables) 통지를 위한 함수를 호출하기 전까지 (메시지큐에) 붙여지지 않습니다.
영문을 고대루 해석하려 하니까 좀 어색한 것 같죠? 쉽게 예를 들어서 설명하자면, 소켓으로부터 읽혀질 데이터가 있다고 가정 합시다. 어플리케이션이 FD_READ 이벤트의 통보를 활성화 했었다면, 윈도우즈 소켓은 지정된 윈도우로 하나의 FD_READ 이벤트를 전송할 것입니다. 이때 어플리케이션이 recv함수나 recvfrom 함수를 호출해야만 FD_READ 이벤트 생성이 다시 활성화 된다는 것입니다. 동시다발적으로 메시지가 도착하지는 않는다는 말입니다. recv 함수나 recvfrom 함수가 호출된 후에 소켓의 수신큐에 더 많은 데이터가 기다리고 있을 경우 다른 FD_READ 이벤트가 지정된 윈도우로 전송될 것입니다. 이렇게 메시지를 재 활성화 하는 함수를 "re-enabling function" 이라고 합니다. 아래의 표에 이러한 함수들을 나열해 보았습니다.

Event | Re-enabling function
FD_READ | recv, recvfrom, WSARecv, or WSARecvFrom
FD_WRITE | send, sendto, WSASend, or WSASendTo
FD_OOB | recv, recvfrom, WSARecv, or WSARecvFrom
FD_ACCEPT | accept or WSAAccept ( condition 함수가 CF_DEFER인 WSATRY_AGAIN 일 경우는 제외)
FD_CONNECT | 없음
FD_CLOSE | 없음
FD_QOS | SIO_GET_QOS 컴맨드로 호출된 WSAIoctl
FD_GROUP_QOS | SIO_GET_GROUP_QOS 컴맨드로 호출된 WSAIoctl
FD_ROUTING _INTERFACE_CHANGE | SIO_ROUTING_INTERFACE_CHANGE 컴맨드로 호출된 WSAIoctl
FD_ADDRESS_LIST _CHANGE | SIO_ADDRESS_LIST_CHANGE 컴맨드로 호출된 WSAIoctl

FD_READ, FD_OOB, 그리고 FD_ACCEPT 이벤트에 대한 메시지 포스팅 방법은 "level-triggered"라고 합니다. 무슨 말이냐구요? 만약 재활성화 루틴이 호출되고, 이와 관련된 상태가 루틴 호출후에도 여전히 남아 있다면, 메시지는 어플리케이션에 다시 포스팅 됩니다. 이러한 포스팅 방법으로 어플리케이션은 메시지 구동 방식이 됩니다. 아직 이해가 잘 않되시죠? 아래의 순서를 한번 생각해 보세요... 지금 제가 한말을 쉽게 이해 할 수 있을 겁니다.

1. 네트웍 전송/수신 스택이 소켓에 100 바이트의 데이터를 수신받고, 윈속이 FD_READ 메시지를 포스팅 했습니다.

2. 어플리케이션이 recv( s, buffer, 50, 0 )을 호출해서 50바이트를 수신했습니다.

3. 읽을 데이터가 여전히 남아있는 동안 FD_READ 메시지가 포스팅 됩니다.

이러한 구조상에서, 어플리케이션은 하나의 FD_READ 메시지에 대해서 모든 가능한 데이터를 읽어낼 필요가 없습니다. 각각의 FD_READ 메시지에 대해서 하나의 recv를 사용하는 것이 적절한 방법입니다. 만약 어플리케이션이 하나의 FD_READ에 대해서 여러개의 recv를 호출할 경우, 여러개의 FD_READ 메시지를 수신할 수도 있습니다. 이러한 어플리케이션에서는 recv함수를 호출하기전에 WSAAsyncSelect 함수를 FD_READ 이벤트를 셋팅하지 않는 방법으로 FD_READ 메시지 수신을 막아 버려야할 필요가 있습니다.

FD_QOS 그리고 FD_GROUP_QOS 이벤트는 "edge triggered"로 간주됩니다. 메시지는 Quality Of Service가 바뀌었을 때 정확히 한번 포스팅 됩니다. 게다가 메시지는 프로바이더가 QOS에서의 다른 변화를 감지하든지, 아니면, 어플리케이션이 소켓에 대한 QOS를 재설정할 때 까지 메시지는 수신되지 않습니다.

FD_ROUTING_INTERFACE_CHANGE 메시지는 SIO_ROUTING_INTERFACE_CHANGE 컴맨드로 WSAIoctl 함수가 호출될 때 포스팅 됩니다.

FD_ADDRESS_LIST_CHANGE 메시지는 SIO_ADDRESS_LIST_CHANGE 컴맨드로 WSAIoctl 함수가 호출될 때 포스팅 됩니다.

만약 어플리케이션이 WSAAsyncSelect함수를 호출하거나 재활성(re-enabling)함수를 호출했을 때 이미 이벤트가 발생되었다면, 이때의 메시지는 적절히 포스팅 됩니다. 이해를 쉽게 하기위해 아래의 일어날 수 순서 상황을 생각해 보세요.

1. 어플리케이션이 생성한 소켓에 대해서 listen 함수를 호출 했습니다.

2. 접속 요구가 들어왔으나 아직 accept 하지 않았습니다.

3. 어플리케이션은 이 소켓에 대해서 FD_ACCEPT로 WSAAsyncSelect 함수를 호출하였습니다. 이때 이벤트의 영속성이 보존되기 때문에 윈속은 FD_ACCEPT 메시지를 바로 포스팅 하게 됩니다.

FD_WRITE 이벤트는 약간 다르게 운용됩니다. 즉, 소켓이 connect/WSAConnect 함수의 호출로 첨 접속되었을 때, 또는 accept/WSAAccept 함수로 접속허용되었을 때, 또는, send 연산이 WSAEWOULDBLOCK 으로 실패(비동기소켓은 항상 WSAEWOULDBLOCK입니다)한 상태에서 전송용 버퍼공간이 사용 가능해졌을 때 FD_WRITE 메시지는 포스팅 됩니다. 따라서 어플리케이션은 FD_WRITE 메시지를 받았을 때 데이터의 전송이 가능하다고 판단 할 수 있습니다.

FD_OOB 이벤트는 소켓이 out-of-band 데이터를 부분적으로 수신하여 나열할 때만 사용됩니다. 만약 소켓이 out-of-band 데이터를 인라인 방식으로 수신하도록 나열 한다면, out-of-band데이터는 일반 데이터와 같이 다루어 지게 됩니다. 이때, 어플리케이션은 interest(?)를 등록해야 합니다. 일반데이터와 같이 다루어 진다는 의미는 뭔지 아시겠죠? FD_OOB 이벤트가 아닌 FD_READ이벤트가 발생했을 때 데이터를 수신한다는 의미입니다. 어플리케이션은 out-of-band 데이터가 SO_OOBINLINE 옵션으로 setsockopt함수나 getsockopt함수를 사용하여 핸들링 하는 방법을 설정할 수 있습니다.

FD_CLOSE 메시지의 에러코드는 소켓이 우아한닫힘(graceful close)인지 그렇지 않은 닫힘인지를 나타냅니다. 만약 에러코드가 0이라면, 소켓은 우아한닫힘 이라는 의미이고, 에러코드가 WSAECONNRESET 이라면, 소켓의 가상 회선망이 리셋되었다는 것을 의미합니다. 이러한 것들은 SOCK_STREAM과 같은 접속 지향형 소켓일 경우에만 사용될 수 있는 것들입니다.

FD_CLOSE 메시지는 소켓과 연관된 가상 회선망이 끊겼다는 것을 수신받았을 때 포스팅 됩니다. TCP 의 경우는 접속이 TIME WAIT 나 CLOSE WAIT 상태로 들어갔을 때 FD_CLOSE 메시지가 포스팅 되게 됩니다. 즉, 원격 종단점에서의 전송영역의 셧다운이나 closesocket 함수의 호출의 결과로 일어날 수 있는 메시지입니다. FD_CLOSE 메시지는 모든 데이터가 소켓으로부터 읽혀지고 난 후에 포스팅 됩니다 그렇긴 해도, 최대한 손실된 데이터들을 피하고자 한다면, FD_CLOSE 메시지를 받은 후에 남아있는 데이터들을 체크하는 것이 좋겠죠?

아래에 지금까지 설명했던 비동기 통지 메시지에 대한 이벤트와 상태들을 간략히 요약해 놓았습니다.

FD_READ:

    WSAAsyncSelect 함수가 호출 되고나서, 수신할수 있는 데이터가 있을 때

    데이터가 로컬 호스트로 도착하고, FD_READ 가 아직 포스팅되지 않았을 때

    recv 함수나 recvfrom 함수가 호출된 후에, 수신가능한 데이터가 여전히 남아 있을 때

    SO_OOBINLINE 옵션으로 setsockopt 함수를 호출하여 out-of-band 데이터가 일반데이터 처럼 취급되었을 때 수신할 out-of-band 데이터가 있을 때

FD_WRITE:

    WSAAsyncSelect 함수가 호출 되고, send 나 sendto 함수가 사용가능 할 때

    connect 나 accept함수가 호출되고 나서, 접속이 완료 되었을 때

    send 나 sendto 함수가 WSAEWOULDBLOCK으로 실패한후, 전송용 버퍼가 사용 가능 할 때

    비접속 지향 소켓의 바인드 후에, FD_WRITE가 현재 발생되었거나 그렇지 않았을 때. (이러한 비접속 지향형 소켓은 바인드 후에 바로 데이터를 전송할 수 있는 상태의 소켓입니다.)

FD_OOB: setsockopt 함수를 이용해서 SO_OOBINLINE 옵션을 무시한 경우에만. (기본 설정값 이죠)

    WSAAsyncSelect 함수가 호출 되고나서, OOB 데이터를 MSG_OOB 플래그로 수신할수 있을 때.

    OOB데이터가 로컬 호스트로 도착하고, FD_OOB 가 아직 포스팅 되지 않았을 때.

    recv 또는 recvfrom 함수가 호출되고나서, 수신가능한 OOB 데이터가 남아 있을때.

FD_ACCEPT:

    WSAAsyncSelect 함수가 호출되고 나서, 허용가능한 접속 요청이 있을 때.

    접속 요청이 로컬호스트로 도착하고, FD_ACCEPT 가 아직 포스팅 되지 않았을 때.

    accept 함수의 호출 후에, 허용가능한 다른 접속 요청이 있을때.

FD_CONNECT:

    WSAAsyncSelect 함수가 호출되고 나서, 접속요청 작업의 완료가 있었던 경우.

    connect 함수가 호출되고 난 후에 접속 작업이 완료되었을 때.

    WSAJoinLeaf 함수의 호출 후에 join 연산이 완료 되었을 때.

    connect, WSAConnect 또는 WSAJoinLeaf 함수가 접속지향형 비동기 모드에서 호출된 후에, 연산이 시작되고 나면, WSAEWOULDBLOCK 이라는 에러코드가 발생될 것입니다. 왜냐구? 비동기기 때문이쥐... 암튼 이러한 비동기 함수의 호출후에 접속이 성공했든 실패했든간에 FD_CONNECT 메시지가 발생합니다. 클라이언트는 FD_CONNECT 메시지가 발생되었을 때 정말로 접속이 성공적으로 일어났는지 아닌지를 판단하기 위해서 에러코드를 체크 해 보아야 합니다.

FD_CLOSE: SOCK_STREAM과 같은 접속 지향형 소켓에서만 발생합니다.

    WSAAsyncSelect 함수가 호출되고, 접속이 종료 되었을때.

    원격지 소켓시스템이 우아한 종료(graceful close)를 한후에, 수신큐에 아무런 데이터가 없는 경우.

    로컬 시스템이 shutdown함수로 우아한 종료(graceful close)를 하고, 원격지 시스템이 이에 End of Data 로 응답하고(TCP 프로토콜의 FIN 이 1로셋팅된 경우), 수신가능한 데이터가 남아있지 않은 경우 발생.

    원격지 시스템이 접속을 리셋 시켰을 때(TCP 프로토콜의 RST가 1로 셋팅된 경우) 발생되는데, 이때 lParam은 WSAECONNRESET 에러 코드를 가지고 있게 됩니다.

    Note : closesocket 함수를 호출하고 난 후에 FD_CLOSE 메시지는 포스팅 되지 않습니다.

FD_QOS:

    WSAAsyncSelect 함수가 호출되고 나서, 소켓과 연관된 Quality Of Service가 변경된 경우

    SIO_GET_QOS 컴맨드로 WSAIoctl 함수가 호출된후, QOS가 변경된 경우

FD_GROUP_QOS (소켓 그룹으로 미래에 사용하기 위해 예약 되었다고 하네요?):

    WSAAsyncSelect 함수가 호출되고 나서, 소켓과 연관된 Group Quality Of Service가 변경된 경우

    SIO_GET_GROUP_QOS 컴맨드로 WSAIoctl 함수가 호출된후, GROUP QOS가 변경된 경우

FD_ROUTING_INTERFACE_CHANGE:

    SIO_ROUTING_INTERFACE_CHANGE 컴맨드로 WSAIoctl 함수가 호출되고 나서 로컬 인터페이스가 변경되었을 때

FD_ADDRESS_LIST_CHANGE

    SIO_ADDRESS_LIST_CHANGE 컴맨드로 WSAIoctl 함수가 호출되고 나서 로컬어드레스의 리스트가 변경되었을 때.

Return Values

에러가 없을 경우 WSAAsyncSelect 함수는 0을 반환 합니다. 에러가 있을 경우 SOCKET_ERROR를 반환 하며, WSAGetLastError 함수를 호출하여 지정된 에러코드를 검색할 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINVAL | 함수의 매개변수가 잘못 사용되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAENOTSOCK | 지정된 소켓기술자가 소켓이 아닙니다.

추가적인 에러코드는 어플리케이션 윈도우가 메시지를 수신할 때 얻어낼 수 있습니다. 지금부터 나열하게될 에러코드는 lParam 매개변수를 WSAGETSELECTERROR 매크로를 이용하여 뽑아낸 에러코드 값입니다.

Event: FD_CONNECT

Error Code | Meaning
WSAEAFNOSUPPORT | 지정된 주소 패밀리가 본 소켓에서 사용될 수 없는 형태 입니다.
WSAECONNREFUSED | 접속시도가 강제로 종료되었습니다.
WSAENETUNREACH | 네트웍이 현재 지정된 호스트로 연결될 수 없습니다.
WSAEFAULT | name 또는 namelen 매개변수가 올바른 형태가 아닙니다.
WSAEINVAL | 소켓이 이미 특정한 어드레스와 바이드 되어 있습니다.
WSAEISCONN | 소켓이 이미 접속상태에 있습니다.
WSAEMFILE | 더 이상 소켓 기술자를 할당 할 수 없습니다.
WSAENOBUFS | 사용할 수 있는 버퍼 공간이 없어서 접속할 수 없습니다.
WSAENOTCONN | 소켓이 접속되어지지 못했습니다.
WSAETIMEDOUT | 접속을 완료하지 못하고 타임아웃 되었습니다.

Event: FD_CLOSE

Error Code | Meaning
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAECONNRESET | 접속이 원격지 로부터 리셋 되었습니다.
WSAECONNABORTED | 접속이 타임아웃이나 다른 에러로 인하여 터미네이트 되었습니다.

Event: FD_READ
Event: FD_WRITE
Event: FD_OOB
Event: FD_ACCEPT
Event: FD_QOS
Event: FD_GROUP_QOS
Event: FD_ADDRESS_LIST_CHANGE

Error Code | Meaning
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.

Event: FD_ROUTING_INTERFACE_CHANGE

Error Code | Meaning
WSAENETUNREACH | 지정한 목적지에 더 이상 도달 할 수 없습니다.
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, select, WSAEventSelect


WSABUF

typedef struct __WSABUF {
u_long
     len;
char FAR  *buf;
} WSABUF, FAR * LPWSABUF;

Members

len
¹öÆÛÀÇ ±æÀÌ

buf
¹öÆÛ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ


WSACancelAsyncRequest

WSACancelAsyncRequest 함수는 비동기 연산중에 있는 작업을 강제적으로 종료하는 함수 입니다.

int WSACancelAsyncRequest (
HANDLE hAsyncTaskHandle
);

Parameters

hAsyncTaskHandle
[입력] 종료될 비동기 작업에 대한 태스크 핸들

Remarks

WSACancelAsyncRequest 함수는 WSAAsyncGetHostByName 함수와 같이 Y값을까지고 X값를 얻어내는 비동기 윈도즈 확장함수(원문에는 WSAAsyncGetXByY 라고 표현이 되어 있네요.)의 비동기 연산을 중도에 취소하는 함수입니다. 취소시킬 연산은 hAsyncTaskHandle 매개변수에 의해서 명시됩니다. 이 hAsyncTaskHandle은 WSAAsyncGetXByY 형태의 함수가 호출될 때 리턴되므로 이값을 임시저장 해 두었다가 WSACancelAsyncRequest 함수를 호출할 때 사용 할 수 있습니다.

이러한 비동기 작업에 대한 작업종료는 WSAEALREADY 에러코드를 내면서 실패 할 수도 있는데, 이러한 경우는 작업에 대한 결과 메시지를 이미 처리한 상태이거나 어플리케이션 윈도즈 큐에 메시지가 대기하고 있는 경우일 수 있습니다. 이러한 경우 WSACancelAsyncRequest 함수는 WSAEALREADY 에러코드를 내면서 실패하게 됩니다.

Return Values

종료작업이 성공적으로 수행된 경우 WSACancelAsyncRequest 함수는 0을 반환합니다. 그렇지 않은 경우는 SOCKET_ERROR을 리턴하게되고, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINVAL | 명시된 비동기 태스크 핸들이 올바른 값이 아닙니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAEALREADY | 종료시키려는 비동기 작업이 이미 완료된 상태입니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSAAsyncGetHostByAddr , WSAAsyncGetHostByName, WSAAsyncGetProtoByName, WSAAsyncGetProtoByNumber, WSAAsyncGetServByName, WSAAsyncGetServByPort


WSACancelBlockingCall

WSACancelBlockingCall 함수는 윈도즈 소켓 함수의 블록화를 취소합니다.

int WSACancelBlockingCall( void );

Remarks

WSACancelBlockingCall 함수는 매개변수를 사용하지 않습니다. 왜냐믄, 한 번에 하나의 블록화 호출만이 효력을 발생 하기때문에 취소할 블록킹 호출이 어느것인지 확실히 알 수 있기 때문입니다.

이 함수를 호출하고 나서 블록화 기능은 최대한 빨리 종료됩니다. 블록화 기능은 실제로 메시지 디스패치 루프에 의해 수행되기 때문에 호출이 종료되기 전에 제어 쓰레드가 메시지 루프로 되 돌아가야 합니다. 이 함수를 호출하여 취소된 블록화 호출은 WSAGetLastError 함수의 결과로 WSAEINTR 에러코드를 반환 할 것입니다.

이 함수는 블록킹 상태를 해제하는 함수입니다. 그러므로 A라는 쓰레드에서 소켓연산으로 블록킹이 지속되는 상태라면, B라는 다른 쓰레드에서 이 함수를 호출해야만 합니다.

그런데요... 이 함수는 윈속2(2.2.0)버젼 에서는 사용할 수 없는 함수가 되어 버렸습니다. WS2_32.DLL 라이브러리로는 export해서 사용할 수 없게 되었다는 말이죠. 즉, 윈속1.1을 사용하는 어플리케이션에서만 WINSOCK.DLL이나, WSOCK32.DLL을 로드해서 이 함수를 사용 할 수 있습니다.

Return Values

성공할 경우 0을 반환하고, 에러가 발생할 경우 SOCKET_ERROR를 반환 합니다. WSAGetLastError 함수를 이용하여 특정한 에러코드를 얻어낼 수 있습니다.

See Also

overview


WSACleanup

WSACleanup 함수는 WS2_32.DLL의 사용을 종료하는 함수입니다.

int WSACleanup (void);

Remarks

이 함수가 사용되기 전에 WSAStartup함수의 성공적이 수행이 있어야 합니다. 이 함수는 WSAStartup함수로 윈속을 초기화 하고 윈도즈 소켓을 다 사용하고 나서 사용한 소켓 리소스를 반환할 때 사용되는 함수이므로 반드시 윈도즈 소켓 사용후에 더 이상 소켓 자원이 필요 없을 때, 꼭 호출되어야 합니다. 또한 이함수가 수행될 때, 블록킹 상태에 있는 처리나, 비동기 작업은 통지 메시지나 이벤트의 포스팅 작업이 없이 바로 취소됩니다. 결국 완벽한 작업을 끝마치지 못한 상태에서 중지되는 것이라 하겠죠. 이러한 경우 연산은 실패로 돌아가고, WSA_OPERATION_ABORTED라는 에러코드를 발생하게 됩니다.

WSACleanup함수가 호출되었을 때 개방된 소켓은 리셋되고 WSACleanup함수가 호출되기 전에 closesocket 함수에 의해 닫힌 소켓은 정상적으로 닫히게 됩니다. 이 때 소켓은 전송 큐에 걸려 있는 데이터를 여전히 가지게 됩니다. WSACleanup 함수가 호출되지 않을 경우 걸려있는 데이터는 그대로 전송되게 됩니다.

참고의 말씀을 드리자면, 이렇게 걸려있는 데이터(pending data)를 다 전송하도록 하려면, 접속을 종료하기 위해 shutdown 함수를 호출해야 합니다. 이렇게 하면 걸려있는 데이터를 모두다 전송 할 때까지 대기하게 되고, 그다음에 closesocket 그리고, WSACleanup 함수를 호출하게 된다면, 아주 이상적으로 소켓을 종료 할 수 있습니다.

블록킹 후크 상태에서 WSACleanup 함수를 호출하려면, 먼저 WSACancelBlockingCall 함수를 먼저 호출하고 나서 WSACleanup 함수를 호출해야만 한다는 점 주의하시구요. 음... 또 주의 해야 할점은 멀티 쓰레드 환경에서, WSACleanup 함수의 호출은 모든 쓰레드에 대해서 윈속 연산을 종료시킨 다는 것입니다. 넘 당연한 야글 했나요?

Return Values

성공할 경우 0을 반환하고, 에러가 발생할 경우 SOCKET_ERROR 에러가 반환되고, WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.

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

overview , closesocket , shutdown, WSAStartup


WSACloseEvent

WSACloseEvent 함수는 개방된 이벤트 객체 핸들을 닫는(close) 함수입니다.

BOOL WSACloseEvent(
WSAEVENT hEvent
);

Parameters

hEvent
[입력] 개방된 이벤트를 식별하는 이벤트 객체 핸들(event object handle)

Remarks

이 함수는 지정된 이벤트 객체 핸들을 닫는 함수입니다. 그렇기 때문에 함수가 성공적으로 수행되고 나서(핸들이 반환되고나서) 이 핸들을 참조하여 어떠한 작업을 하려 하면, WSA_INVALID_HANDLE 이라는 에러코드를 발생하면서 실패하게 됩니다.

Return Values

함수가 성공적으로 수생된다면, TRUE를 반환하고, 그렇지 않다면, FALSE를 반환합니다. 또한, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생했습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSA_INVALID_HANDLE | hEvent 가 올바른 이벤트 객체 핸들이 아닙니다.

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

overview, WSACreateEvent , WSAEnumNetworkEvents , WSAEventSelect , WSAGetOverlappedResult , WSARecv , WSARecvFrom , WSAResetEvent , WSASend , WSASendTo , WSASetEvent , WSAWaitForMultipleEvents


WSAConnect

WSAConnect 함수는 다른 소켓 어플리케이션과 접속을 이루고, 접속 데이터를 교환하고, 매개변수로 지정되는 FLOWSPEC 구조체에 기반을 둔 필요한 서비스의 특성을 지정하는 함수 입니다.

int WSAConnect (
SOCKET s,
const struct sockaddr FAR * name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS
);

Parameters

s
[입력] 접속하고자 하는 소켓을 지정하는 기술자.

name
[입력] 접속하고자 하는 다른 어플리케이션에 있는 소켓의 이름(SOCKADDR)

namelen
[입력] 이름(sockaddr)의 길이

lpCallerData
[입력] 접속하는 동안 상대방 소켓에게 보낼 유저 데이터의 포인터

lpCalleeData
[출력] 접속하는 동안 상대방에게 전송받을 유저 데이터의 포인터

lpSQOS
[입력] 소켓 s 에 대한 FLOWSPEC 구조체의 포인터

lpGQOS
[입력] 소켓그룹(socket group)에 사용하기 위해서 예약된 매개변수입니다. 이 값은 소켓그룹에 대한 FLOWSPEC 구조체의 포인터 입니다.

Remarks

WSAConnect 함수는 지정된 상대방으로 접속을 이루고, 접속하는 동안 다른 몇몇개의 부수적인 연산을 수행하는 함수입니다. 만약 바인드 되지 않은 소켓 s를 넘겨주어 이 함수를 호출한다면, 소켓시스템과 연관된 로컬영역에는 유일한 값이 할당되고, 소켓은 바인드 됩니다.

접속지향형 소켓(ex. SOCK_STREAM 형태의 소켓)에서 활성화된 접속은 name 매개변수를 이용하여 외부 호스트로 접속을 시작합니다. 이 함수가 성공적으로 완료되었을 때, 소켓은 데이터의 전송/수신을 위한 준비가 되었다고 보면 됩니다. 이 name 구조체의 address 필드가 모두 0 이라면 어떻게 될까요? 당연히 에러를 내게 되는데, WSAEADDRNOTAVAIL 에러코드를 발생하게 됩니다. 또한 이미 접속되어 있는 소켓을 다시 접속하려 할 때도 에러를 내게 되는데, 이 때 WSAEISCONN 에러코드를 발생하며 실패하게 됩니다.

비동기 소켓인 접속지향형 소켓에서, 이 함수는 종종 접속작업이 바로 완료되지 않는 경우가 있습니다. 이러한 경우 이 함수는 WSAEWOULDBLOCK 에러코드를 발생하게 됩니다. 하지만, 이러한 경우는 에러상황이라고 볼 수 없습니다. 접속작업은 계속 진행 되고 있기 때문이죠. 함수가 성공했다 실패했다를 알 수 있는 상태가 되었을 때 어플리케이션이 이러한 통지를 어떻게 받을지 지정한 방법에 의해서 보고를 받을 수 있습니다. 클라이언트가 select 함수를 이용했다면, 함수가 성공한 경우 writefds 가 설정되고, 실패한 경우 exceptfds 가 설정됩니다. WSAAsyncSelect 함수나 WSAEventSelect 함수를 사용한 경우, FD_CONNECT 메시지와, FD_CONNECT와 관련된 에러코드가 통지될 것입니다.

비접속 소켓(ex. SOCK_DGRAM 타입)에서, WSAConnect 함수로 수행되는 연산은 나중에 사용될 접속지향형 전송/수신에 사용할 수 있게 하기위해 기본 목적지 어드레스만을 지정합니다. 중의 해야 할 점이 하나 있는데, 만약 이 함수로 지정되지 않은 목적지 어드레스와 다른 곳으로부터 날라온 데이터 그램은 버려지게 됩니다. name 구조체의 address 필드가 모두 0 이라면, 소켓의 접속은 끊겨 버리고, 기본 상대방 어드레스틑 확정되지 않은 값을 가지게 되므로, send/WSASend 함수나 recv/WSARecv 함수는 WSAENOTCONN 에러코드를 내며 실패하게 될 것입니다. 즉 사용 할 수 없다는 말이죠. 하지만, sendto/WSASendTo 함수와 recvfrom/WSARecvFrom 함수는 여전히 사용가능합니다. 기본 목적지 주소는 간단히 WSAConnect 함수를 다시 호출함으로써 변경이 가능합니다. 이전에 대상 소켓이 접속된 상태였어도 가능합니다. 이럴 경우에 주의 해야 할 점이 하나 있는데, 수신하기 위해 큐에 버퍼링 되어 있던 데이터그램은 모두 버려진다는 것입니다. 물론 새로 설정한 목적지가 이전에 설정한 목적지와 다를 경우에만 말이죠.

비접속 지향형 소켓에서, name 매개변수는 브로드캐스트 어드레스를 지정하여 사용 할 수 있습니다. 하지만, 브로트캐스팅 하기위해 접속을 시도하기 위해서는 setsockopt 함수로 SO_BROADCAST를 설정해야 합니다. 만약 이렇게 설정하지 않고 브로드캐스팅을 하려 한다면, WSAConnect 함수는 WSAEACCES 에러코드를 내면서 실패하게 될 것입니다.

lpCallerData 는 접속 요청을 하는동안 전송할 특정한 유저 데이터를 가지고 있는 매개변수입니다. 만약 lpCallerData가 NULL 이라면, 유저 데이터는 상대방에게 전송되지 않습니다. lpCalleeData는 접속하는동안 상대방에게 유저 데이터를 받을 WSABUF 구조체의 포인터입니다. lpCalleeData 의 len 필드는 lpCalleeData 의 buf 필드에 할당된 메모리 공간의 크기를 설정하는 값입니다. 만약 상대방으로부터 유저 데이터가 들어오지 않았다면, lpCalleeData의 len 필드는 0으로 설정될 것입니다. 동기소켓에서, 접속연산은 WSAConnect 함수가 반환 될 때 완료됩니다. 비동기 소켓에서의 작업은 FD_CONNECT 통지가 발생한 후에 완료될 것입니다. 만약 lpCalleeData 가 NULL 이면, 유저 데이터는 받지 않습니다.

접속할 때, 어플리케이션은 SIO_SET_QOS 또는 SIO_SET_GROUP_QOS 연산코드로 WSAIoctl 함수를 이용해서 이전에 설정한 서비스의 특성(quality of service; QOS)를 무시하기위해 lpSQOS 와 lpGQOS 매개변수를 사용할 수 있습니다.

Return Values

에러가 발생하지 않으면, WSAConnect 함수는 0을 반환 합니다. 에러가 발생한 경우, SOCKET_ERROR를 반환하고, WSAGetLastError 함수를 사용해서 특정한 에러코드를 얻어낼 수 있습니다. 동기소켓에서의 반환값은 접속 시도의 성공과 실패를 의미하게 됩니다.

비동기 소켓에서 접속시도는 바로 완료되지 않을 수 잇습니다. 이러한 경우 WSAConnect 함수는 SOCKET_ERROR을 반환하고, WSAEWOULDBLOCK 에러코드를 발생하게 됩니다. 주의 해야 할 점은 이러한 경우 즉, SOCKET_ERROR를 반환하고, WSAEWOULDBLOCK 에러코드를 발생하는 경우는 접속 연산이 확실히 실패한 경우가 아니라는 것입니다. 접속연산의 완료 상태를 체크하기 위해 어플리케이션은 아래와 같은 방법을 취할 수 있습니다.

  1. select 함수를 사용하여 소켓이 writeable 이라는 상태를 체크함으로써 접속 요구의 완료를 결정하는데 사용할 수 있습니다.
  2. 접속 이벤트를 알아내기 위해서 WSAAsyncSelect 함수를 사용한다면, 접속연산이 완료 되었을 때(접속이 성공하는 실패하든) FD_CONNECT 통지를 받을 것입니다.
  3. 접속 이벤트를 알아내기 위해서 WSAEventSelect 함수를 사용한다면, 접속연산이 완료 되었을 때(접속이 성공하는 실패하든) 관련된 이벤트 오브젝트는 신호를 받을 것입니다.

비동기 소켓에서, 접속시도가 완료 되기전에 WSAConnect 함수에 지정한 소켓을 가지고 소켓함수를 사용하게 되면, WSAEALREADY 라는 에러코드를 발생하면서 실패할 것입니다.

에러코드가 접속시도 실패(즉, WSAECONNREFUSED, WSAENETUNREADCH, WSAETIMEOUT) 인 경우 어플리케이션은 같은 소켓으로 다시 WSAConnect 함수를 호출 할 수 있씁니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEADDRINUSE | 소켓이 어드레스의 재사용 옵션이 SO_REUSEADDR을 마킹하지 않은 상태에서 지정된 소켓의 어드레스가 이미 사용중일 때.
WSAEINTR | 동기 소켓에서 사용되었을 때 이 작업이 WSACancelBlockingCall 함수에 의해서 중지 되었을 경우.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다. 또는 다른 서비스 프로바이더가 다른 콜백함수를 처리하고 있습니다.
WSAEALREADY | 비동기 connect/WSAConnect 함수가 지정한 소켓에 대해서 이전에 호출되었는데, 현재 그 작업을 처리 중에 있습니다.
WSAEADDRNOTAVAIL | 지정한 원격지 어드레스가 사용할 수 있는 어드레스가 아닙니다. (ADDR_ANY를 마킹 했는지 확인해 보세요)
WSAEAFNOSUPPORT | 특별히 지정된 어드레스 집합(family)이 이 소켓에 대해서 사용될 수 없습니다.
WSAECONNREFUSED | 접속시도가 리젝트(reject)되었습니다.
WSAEFAULT | name 이나 namelen 매개변수가 제대로 할당받은 공간이 아닙니다. 또는 namelen 매개변수가 너무 작거나, lpCalleeData 와 lpSQOS, lpGQOS에 대한 버퍼길이가 너무 작거나 lpCallerData 의 버퍼 길이가 너무 큽니다.
WSAEINVAL | s 매개변수가 리슨 소켓으로 사용되고 있는 경우.
WSAEISCONN | 접속 지향형 소켓에서 소켓이 이미 접속되어 있는 경우
WSAENETUNREACH | 현재 네트웍이 상대방까지 도달하지 않습니다.
WSAENOBUFS | 사용가능한 버퍼공간이 없어서 소켓은 접속할 수 없습니다.
WSAENOTSOCK | 지정한 기술자가 소켓이 아닙니다.
WSAEOPNOTSUPP | lpSQOS, lpGQOS 로 지정된 FLOWSPEC 구조체가 완벽하지 않습니다.
WSAEPROTONOSUPPORT | lpCallerData 매개변수를 서비스 프로바이더가 지원하지 않습니다.
WSAETIMEDOUT | 접속 시도가 타임 아웃 되었습니다.
WSAEWOULDBLOCK | 비동기 소켓이고, 접속이 바로 완료되지 않은 경우
WSAEACCES | setsockopt 함수에서 SO_BROADCAST를 설정하지 않고, 데이터그램 소켓을 브로드캐스트 어드레스로 접속하려 하는 시도가 있었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, accept, bind, connect, getsockname, getsockopt, select, socket, WSAAsyncSelect, WSAEventSelect


WSACreateEvent

WSACreateEvent 함수는 새로운 이벤트 객체를 생성하는 함수 입니다.

WSAEVENT WSACreateEvent( void );

Remarks

WSACreateEvent 함수는 신호받지 않은 초기상태를 직접 리셋하여 생성한 이벤트 객체를 생성하는데 사용됩니다. 윈소2 이벤트 객체는 Win32 환경의 시스템 객체입니다. 따라서, Win32 어플리케이션이 자동 리셋 이벤트(auto reset events)를 원한다면, 이 함수를 직접 수행하면 됩니다. 이벤트 객체의 범위(스코프)는 객체가 생성된 프로세스로 제한됩니다.

Return Values

함수가 성공적으로 수행된 경우 WSACreateEvent 함수는 이벤트 객체의 핸들을 반환 합니다. 반면, 실패한 경우 반환값은 WSA_INVALID_EVENT를 가집니다. 그리구, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생했습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSA_NOT_ENOUGH_MEMORY | 이벤트 객체를 생성하기 위한 메모리 공간이 남아있지 않습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent, WSAEnumNetworkEvents , WSAEventSelect , WSAGetOverlappedResult , WSARecv , WSARecvFrom , WSAResetEvent , WSASend , WSASendTo , WSASetEvent , WSAWaitForMultipleEvents


WSADATA

typedef struct WSAData {
WORD                                  wVersion;
WORD
                                 wHighVersion;
char                                     szDescription[WSADESCRIPTION_LEN+1];
char                                     szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned  short           iMaxSockets;
unsigned  short           iMaxUdpDg;
char FAR *                      lpVendorInfo;
} WSADATA, FAR* LPWSADATA;

Members

wVersion
사용하고자 하는 윈도즈 소켓의 버전

wHighVersion
DLL이 제공하는 윈도즈 소켓의 가장 상위 버전. 일반적으로 이 값은 wVersion과 같아야 합니다.

szDescription
윈도즈 소켓의 명세를 카피한 널로 끝나는 ASCII 스트링입니다. 이 텍스트(256개 까지만 허용)는 제어문자와 포맷문자를 제외한 캐릭터를 사용할 수 있습니다.

szSystemStatus
윈속 DLL 에 관련된 상태나 환경정보를 복사하기 위한 널로 끝나는 ASCII 스트링입니다.

iMaxSockets
최대 소켓을 기술하는데, 윈속2 에서는 하위버젼과의 호환성을 위해 남겨두었습니다.

iMaxUdpDg
UDP 데이터 그램으로 받을 수 있는 최대 메시지 크기를 나타냅니다. 그런데 윈속2 에서는 하위 버전과의 호환성 때문에 남겨두었다 하네요. 즉, 윈속2 에서는 무시됩니다.

lpVendorInfo
벤더 정보를 나타내는 멤버입니다. 윈속2 에서는 이전버젼과의 호환성 때문에 남겨두었다고 합니다. 즉, 윈속2 에서는 무시됩니다.


WSADuplicateSocket

WSADuplicateSocket 함수는 공유소켓에 대한 새로운 소켓 기술자를 생성하는데 사용될 수 있는 WSAPROTOCOL_INFO 구조체를 반환하는 함수 입니다.

int WSADuplicateSocket (
SOCKET s,
DWORD dwProcessId,
LPWSAPROTOCOL_INFO lpProtocolInfo
);

Parameters

s
[입력] 로컬소켓을 구분짖는 기술자

dwProcessId
[입력] 복제된 소켓이 사용될 타겟 프로세스의 프로세스 아이디

lpProtocolInfo
[출력] WSAPROTOCOL_INFO 구조체를 담기위해 충분한 크기를 가진 클라이언트에서 할당되 버퍼의 포인터입니다. 서비스 프로바이더는 이 버퍼에 프로토콜 정보를 카피합니다.

용진이 바보당..넌 진짜루 바보양.

Remarks

WSADuplicateSocket 함수는 프로세스 간에 소켓을 공유하는데 사용되는 함수입니다. 원본 프로세스는 WSADuplicateSocket 함수를 호출해서 특별한 WSAPROTOCOL_INFO 구조체를 얻어냅니다. 이 구조체는 목적지 프로세스로 이 구조체의 내용을 넘기기 위해 프로세스 상호간의 통신(IPC) 매커니즘을 사용합니다. 구조체의 내용을 받은 프로세스는 WSASocket 함수를 사용하여 소켓을 복제하기위해 소켓 기술자를 얻어냅니다. 이 WSAPROTOCOL_INFO 구조체는 타겟 프로세스에서 단 한번만 사용될 수 있습니다.

소켓은 한 프로세스 내에서의 쓰레드 사이에서 WSADuplicateSocket 함수를 사용하지 않고 공유 할 수 있습니다. 왜냐하면, 소켓 기술자 값은 모든 쓰레드 내에서 인식될 수 있는 올바른 값이기 때문입니다.

다른 프로세스간에 공유된 소켓을 만들고, 핸들링 하는 시나리오를 아래에 예로 들어 보았습니다.

Source Process | IPC | Destination Process
1) WSASocket, WSAConnect 함수 호출 |  |
2) 소켓을 복제할 대상 프로세스의 아이디를 요구함 | → |
 |  | 3) 프로세스 아이디 요구를 받고, 이에 응답함.
4) 프로세스 아이디를 얻어냄 | ← |
5) WSADuplicateSocket 함수를 호출해서 WSAPROTOCOL_INFO 구조체를 얻어냅니다. |  |
6) 대상 프로세스로 WSAPROTOCOL_INFO 구조체의 내용을 보냅니다. |  |
 | → | 7) WSAPROTOCOL_INFO 구조체의 내용을 받습니다.
 |  | 8) WSASocket 함수를 호출해서 공유소켓의 기술자를 생성합니다.
10) closesocket |  | 9) 데이터 처리에 공유소켓을 사용합니다.

공유소켓을 가리키는 기술자는 I/O에 대해서 독립적으로 사용될 수 있습니다. 하지만, 윈도즈 소켓 인터페이스는 특정한 타입의 접근에 대해서는 구현되지 않은 점도 있습니다. 공유소켓은 일반적으로 공유소켓을 사용할때, 생성, 접속을 하나의 프로세스에서 담당하고, 데이터의 전송/수신 부분은 다른 프로세스에서 처리하는 형태가 됩니다.

Return Values

에러가 발생하지 않으면, WSADuplicateSocket 함수는 0을 반환 합니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError 함수로 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEINVAL | 지정한 매개변수중 하나가 잘못된 값을 넘겼습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEMFILE | 사용가능한 소켓기술자가 더 이상 없습니다.
WSAENOBUFS | 사용가능한 버퍼가 없어서, 소켓을 생성 할 수 없습니다.
WSAENOTSOCK | 기술자가 소켓이 아닙니다.
WSAEFAULT | lpProtocolInfo 매개변수가 제대로 할당된 메모리 어드레스를 가지고 있지 않습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSASocket


WSAEnumNetworkEvents

WSAEnumNetworkEvent 함수는 지정된 소켓에 대한 네트웍 이벤트의 발생을 알아내고, 내부 네트웍 이벤트 레코드를 클리어 하고, 이벤트 객체를 리셋하는 함수 입니다.

int WSAEnumNetworkEvents (
SOCKET s,
WSAEVENT hEventObject,
LPWSANETWORKEVENTS lpNetworkEvents
);

Parameters

s
[입력] 소켓을 식별하는 기술자

hEventObject
[입력] 리셋하기 위한 이벤트 객체를 명시하는 핸들 입니다.

lpNetworkEvents
[출력] WSANETWORKEVENTS 구조체의 포인터입니다. 이 구조체는 발생된 네트웍 이벤트와 관련된 에러코드로 구성되어 있습니다.

Remarks

WSAEnumNetworkEvents 함수는 이 함수를 호출하기 바로 전까지 지정된 소켓 s 에 대해서 발생된 네트웍 이벤트를 알아내는데 사용되는 함수입니다. 이 함수는 WSAEventSelect 함수와 같이 사용한다고 생각하면 됩니다.

WSAEnumNetworkEvents 함수는 네트웍 동작과 WSAEventSelect 함수로 지정된 에러를 레포팅 합니다. 이러한 함수가 어떻게 네트웍 동작과 에러를 찾아내는지 알아보려면, select 와 WSAAsyncSelect 함수의 명세를 보시기 바랍니다.

소켓의 네트웍 이벤트 내부 기록은 lpNetworkEvents 매개변수에 의해서 참조된 구조체로 복사되고, 내부 네트웍 이벤트 기록이 있는 곳은 클리어 됩니다. hEventObject 매개변수가 NULL 이 아니라면, 발생한 이벤트 객체는 또한 리셋됩니다. 윈도즈 소켓 프로바이더는 네트웍 이벤트 기록을 복사하는 작업과, 이 기록을 클리어 하는 것 그리고, 관련된 이벤트 객체를 리셋하는 책임을 집니다. 다음으로 발생되는 등록된 네트웍 이벤트는 이벤트 객체를 설정되도록 할 것입니다. 함수가 SOCKET_ERROR를 반환하는 경우에는 관련된 이벤트 객체가 리셋되지 않고, 네트웍 이벤트의 기록이 클리어 되지 않습니다.

WSANETWORKEVENTS 구조체의 INetworkEvents 멤버는 FD_XXX 계열의 네트웍 이벤트가 발생됨을 암시합니다. iErrorCode 배열은 INetworkEvents 의 이벤트 비트의 위치와 부합하는 배열 인덱스로 관련된 에러코드를 포함하는데 사용됩니다. FD_READ_BIT와 FD_WRITE_BIT 와 같은 식별자는 iErrorCode 배열의 인덱스로 사용될 수 있습니다. 이러한 iErrorCode 배열의 요소들 만이 INetworkEvents 필드에 설정될 수 있다는 것을 명심하십시요. 다른 필드들은 수정되는 않되는 필드들입니다.

아래의 에러코드는 일치하는 네트웍 이벤트에 따라서 반환될 수 있습니다.

Event: FD_CONNECT

Error Code | Meaning
WSAEAFNOSUPPORT | 지정된 패밀리(family)인 어드레스가 이 소켓에 대해서 사용될 수 없습니다.
WSAECONNREFUSED | 접속시도가 강제적으로 리젝트(reject) 되었습니다.
WSAENETUNREACH | 네트웍이 현재 호스트로부터 도달할 수 없는 상태입니다.
WSAENOBUFS | 사용할 수 있는 버퍼 공간이 없습니다. 소켓은 접속될 수 없습니다.
WSAETIMEDOUT | 접소시도가 접속이 이루어지지 않은 상태에서 타임아웃 되었습니다.

Event: FD_CLOSE

Error Code | Meaning
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.
WSAECONNRESET | 접속이 원격지 단말에서 리셋되었습니다.
WSAECONNABORTED | 접속이 타임아웃이나 다른 에러로 인하여 종료되었습니다.

Event: FD_READ

Event: FD_WRITE

Event: FD_OOB

Event: FD_ACCEPT

Event: FD_QOS

Event: FD_GROUP_QOS

Event: FD_ADDRESS_LIST_CHANGE

Error Code | Meaning
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생 했습니다.

Event: FD_ROUTING_INTERFACE_CHANGE

Error Code | Meaning
WSAENETUNREACH | 지정한 목적지에 더 이상 도달 할 수 없습니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생했습니다.

Return Values

작업이 성공적으로 수행된 경우 0을 반환 합니다. 에러가 발생한 경우 SOCKET_ERROR을 반환 하면, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생했습니다.
WSAEINVAL | 지정된 매개변수중에 하나가 올바른 값이 아닙니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAENOTSOCK | 지정된 기술자가 소켓 기술자가 아닙니다.
WSAEFAULT | lpNetworkEvents 매개변수가 제대로 할당받은 메모리 공간이 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSAEventSelect


WSAEnumProtocols

WSAEnumProtocols 함수는 사용가능한 트랜스포트 계층의 프로토콜에 대한 정보를 반환하는 함수입니다.

int WSAEnumProtocols (
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
ILPDWORD lpdwBufferLength
);

Parameters

lpiProtocols
[입력] NULL로 끝나는 프로토콜 값의 배열입니다. 이 매개변수는 부가적으로 사용되는 값이죠. 만약 lpiProtocols 매개변수가 NULL 이라면, 모든 사용가능한 프로토콜들의 정보가 반환되게 됩니다. NULL이 아니라면, 단지 이 어레이에 지정된 프로토콜에 대한 정보만이 반환됩니다.

lpProtocolBuffer
[출력] WSAPROTOCOL_INFO 구조체로 프로토콜 정보를 채울 버퍼

lpdwBufferLength
[입력/출력] 이 매개변수가 입력용으로 사용될 경우 WSAEnumProtocols 함수에 넘기는 lpProtocolBuffer 버퍼에 대한 바이트의 갯수를 넘깁니다. 출력용으로 사용될 경우는 모든 요청된 정보를 반환하기 위하여 WSAEnumProtocols 함수에 넘길 수 있는 최소버퍼 크기를 나타냅니다.

Remarks

WSAEnumProtocols 함수는 트랜스포트 계층 프로토콜과 로컬에 설치된 프로토콜 체인에 대한 정보를 얻어내는데 사용하는 함수입니다. 계층적 프로토콜은 프로토콜 체인이 설치되었을 때만 어플레케이션에서 사용할 수 있기 때문에, 계층적 프로토콜 정보는 lpProtocolBuffer 에 포함되지 않습니다.

WSAPROTOCOL_INFO는 각각의 요청된 프로토콜에 대해서 프로토콜 정보를 담을 구조체입니다. 만약 이 버퍼가 모든 정보를 담기에 충분하지 못하다면, lpdwBufferLength 매개변수는 필요한 버퍼의 크기로 업데이트 될 것입니다. 어플리케이션은 이 크기를 확인하고, 모든 정보를 담기에 충분한 버퍼를 다시 마련하여 WSAEnumProtocols 함수를 다시 호출할 수 있습니다.

Return Values

함수가 성공적으로 수행된다면, 함수는 얻어낸 프로토콜의 갯수를 반환 할 것입니다. 에러가 발생한 경우는, SOCKET_ERROR 가 반환되고, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했습니다.
WSAEINPROGRESS | 블록킹 윈속1.1 이 현재 처리주에 있습니다.
WSAEINVAL | 지정된 매개변수중 하나가 잘못된 값입니다.
WSAENOBUFS | 지정된 버퍼 길이가 모든 관련된 WSAPROTOCOL_INFO구조체와 정보를 담기에 너무 작습니다. 넘겨주는 버퍼는 최소한 lpdwBufferLength로 반환된 값보다 커야 합니다.
WSAEFAULT | lpiProtocols, lpProtocolBuffer, lpdwBufferLength 매개변수중에 잘못된 어드레스를 가리키는 공간이 있습니다.

QuickInfo

Windows NT : 사용가능
 Windows : 사용가능
Windows CE : 지원하지 않음
Header :
Win32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview


WSAEventSelect

WSAEventSelect 함수는 FD_XXX 네트웍 이벤트와 연관되는 이벤트 객체를 지정하기위해 사용되는 함수입니다.

int WSAEventSelect (
SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents
);

Parameters

s
[입력] 대상 소켓 기술자

hEventObject
[입력] FD_XXX 네트웍 이벤트와 연관되는 이벤트 객체를 명시한 핸들

lNetworkEvents
[입력] 어플리케이션에서 발생시키고자 하는 FD_XXX 네트웍 이멘트의 비트조합

Remarks

WSAEventSelect 함수는 선택된 FD_XXX 네트웍 이벤트(INetworkEvents)와 연관될 이벤트 객체(hEventObject)를 명시하는데 사용하는 함수입니다. 이벤트 객체가 명시될 소켓은 s 매개변수입니다. 이벤트 객체는 등록된 네트웍 이벤트가 발생했을 때 설정됩니다.

WSAEventSelect 함수는 WSAAsyncSelect 함수와 매우 유사하게 동작합니다. 차이점이라면, 등록된 네트웍 이벤트가 발생됐을 때 동작되는 부분이죠. WSAAsyncSelect 함수는 명시된 윈도즈 메시지가 메시지 큐에 포스팅 되는 형태이고, WSAEventSelect 함수는 관련된 이벤트 객체를 설정하고, 내부적인 네트웍 이벤트의 발생을 남기는 형태입니다.

어플리케이션은 대기하거나 네트웍 이벤트 객체를 폴링하기 위해 WSAWaitForMultipleEvents 함수를 사용할 수 있습니다. 그리구, WSAEnumNetworkEvents 함수를 사용하여 내부적으로 발생한 네트웍 이벤트의 내용을 얻어낼 수 있습니다. 즉, 이렇게 함으로써 발생한 네트웍 이벤트가 어떠한건지 알아낼 수 있다는 거죠.

WSAEventSelect 함수는 INetworkEvents 의 값과는 상관없이 자동으로 소켓 s 를 비동기 모드로 설정합니다. 소켓을 다시 동기모드로 되돌려놓는 방법에 대해 알고 싶으며, ioctlsocket/WSAIoctl 함수를 살펴보도록 하세요.

INetworkEvents 매개변수는 아래에 나열된 값들을 OR 연산해서 얻은 값으로 구성됩니다.

Value | Meaning
FD_READ | 데이터를 읽을(수신) 수 있다라는 통지를 받고자 할 때
FD_WRITE | 데이터를 쓸(송신) 수 있다라는 통지를 받고자 할 때
FD_OOB | out-of-band 데이터의 수신에 대한 통지를 받고자 할 때
FD_ACCEPT | 접속요구에 대한 통지를 받고자 할 때
FD_CONNECT | 접속작업이나 다중 "join" 연산의 통지를 받고자 할 때
FD_CLOSE | 소켓이 닫혔다라는 통지를 받고자 할 때
FD_QOS | 소켓 Quality of Service(QOS)가 바뀌었다는 통지를 수신하고자 할 때
FD_GROUP_QOS | 소켓 Group Quality of Service(GROUP_QOS)가 바뀌었다는 통지를 수신하고자 할 때
FD_ROUTING _INTERFACE_CHANGE | 특정한 목적지에 대해서 라우팅 인터페이스가 변경되었다는 통지를 받고자 할 때
FD_ADDRESS_LIST _CHANGE | 소켓 어드레스 집합에 대해서 로컬 어드레스 리스트가 변경했다는 통지를 받고자 할 때

한 소켓에 대해서 WSAEventSelect 함수를 호출하게되면, 같은 소켓에 대해서 이전에 WSAAsyncSelect 함수나 WSAEventSelect 함수의 호출을 무시하게 되고, 이전에 설정되었던 내부적 네트웍 이벤트 등록을 없애버립니다. 한 예로, 읽기와 쓰기 네트웍 이벤트 양쪽을 받고자 하는 상태를 만들기 위해서는 아래의 코드와 같이 FD_READ와 FD_WRITE를 양쪽다 같이 설정해 주어야 합니다. 달리 말하자면, 먼저 FD_READ하고 나중에 FD_WRITE 한다고 읽기와 쓰기 모두에 대해서 통지 메시지를 받지는 않는다는 점을 꼭 기억하세요. 이렇게 하면, FD_READ는 무시되고 FD_WRITE만 통지 받게 됩니다.

rc = WSAEventSelect(s, hEventObject, FD_READ|FD_WRITE);

다른 네트웍 이벤트에 대해서 다른 이벤트 객체를 명시하는 방법은 불가능 합니다. 아래의 코드는 제대로 동작하지 않을 것입니다. 즉, 두 번째 구문의 호출이 첫 번째 구문의 호출의 효과를 무시해 버릴 것입니다. 그리고, 단지 FD_WRITE 네트웍 이벤트 만이 hEventObject2에 대해서 발생할 것입니다.

rc = WSAEventSelect(s, hEventObject1, FD_READ);
rc = WSAEventSelect(s, hEventObject2, FD_WRITE);

관련된 그리고 한 소켓에 대해서 선택된 네트웍 이벤트를 취소하기 위해서 INetworkEvent 를 0으로 설정해서 WSAEventSelect 함수를 호출하면 됩니다. 이렇게 하면, hEventObject 매개변수는 앞으로 무시될 것입니다.

rc = WSAEventSelect(s, hEventObject, 0);

closesocket 함수로 소켓을 종료하게 되면 소켓에 대해서 WSAEventSelect로 지정된 네트웍 이벤트를 취소하게 됩니다. 하지만, 어플리케이션은 반드시 WSACloseEvent 함수를 호출해서 이벤트 객체와 리소스를 반환 해 줘야 합니다.

리슨소켓으로 접속허용(accepted)되어 생성된 소켓은 리슨소켓과 같은 속성을 가지게 됩니다. 예를들어 리슨소켓이 FD_ACCEPT, FD_READ, 그리고 FD_WRITE 속성을 가지도록 설정되어 있다면, 접속허용된 소켓도 리슨 소켓과 같은 FD_ACCEPT, FD_READ, FD_WRITE 속성을 가지게 된다는 것입니다. 새로 생성된 접속허용된 소켓에 다른 네트웍 이벤트를 설정하고 싶으면, WSAEventSelect 함수를 호출하여 새로운 정보로 설정해 주어야 합니다.

select 나 WSAAsyncSelect 함수의 경우와 같이 WSAEventSelect 함수는 데이터 전송/수신 연산(send/recv)이 일어날 수 있는 시점을 결정하는데 자주 사용됩니다. 하지만, 100%정확하게 이러한 시점에서 데이터를 전송하거나 수신할 수 있는 것은 아닙니다. 예외적인 상황이 발생 할 수도 있다는 거죠. 예를들어 데이터를 수신해도 된다는 FD_READ 이벤트를 받고나서 데이터를 수신했을 때 WSAEWOULDBLOCK 이라는 에러가 발생 할 수도 있다는 의미입니다. 그러므로 튼튼한 어플리케이션을 만들려면, 이러한 예외적인 상황에 대비할 수 있는 준비를 해야 합니다. 아래에 이러한 상황이 일어날 수 있는 시나리오를 한번 생각해 봤습니다. 참고하세요.

1. 데이터가 소켓 s 에 도착 했습니다. 윈도즈 소켓은 WSAEventSelect 이벤트 객체를 설정합니다.

2. 어플리케이션은 몇몇 다른 작업을 진행하고 있는 도중입니다.

3. 작업을 진행하고 있는동안 ioctlsocket( s, FIONREAD...)를 호출했다고 해봅시다. 그러면, 읽을 수 있는 데이터가 있다는 사실을 알게 되겠죠.

4. 어플리케이션은 데이터를 읽기 위해서 recv(s, ...)를 호출 할 것입니다.

5. 하던 작업이 끝나면, 1.에서 설정된 이벤트 객체가 있으므로 데이터를 읽을 수 있는 상태라는 것을 알 수 있게 됩니다.

6. 어플리케이션은 데이터를 읽기 위해서 recv(s, ...)를 호출할 것이고, 이미 이 데이터는 읽혀졌지 때문에 WSAEWOULDBLOCK 에러를 내면서 실패 하게 됩니다.

이벤트 객체와 연관된 신호와 네트웍 이벤트의 발생을 계속 성공적으로 발생시키려면, 네트웍 이벤트가 통지 되었을 때 이벤트 객체와 연관된 재활성화(re-enabling) 함수를 명시적으로 호출해 주어야 합니다. 그래야만, 다음에 발생하는 네트웍 이벤트나 신호를 받을 수 있게 됩니다. 아래의 표에 각 네트웍 이벤트에 해당하는 재활성화 함수(re-enabling function)을 나열해 보았습니다.

Network Event | Re-enabling function
FD_READ | recv , recvfrom, WSARecv, 또는 WSARecvFrom
FD_WRITE | send , sendto, WSASend, 또는 WSASendTo
FD_OOB | recv , recvfrom, WSARecv, 또는 WSARecvFrom
FD_ACCEPT | accept 또는 WSAAccept 에러코드가 WSATRY_AGAIN이 발생했을 경우는 예외
FD_CONNECT | 없당
FD_CLOSE | 없당
FD_QOS | SIO_GET_QOS 컴맨드로 호출된 WSAIoctl
FD_GROUP_QOS | SIO_GET_GROUP_QOS 컴맨드로 호출된 WSAIoctl
FD_ROUTING _INTERFACE_CHANGE | SIO_ROUTING_INTERFACE_CHANGE 컴맨드로 호출된 WSAIoctl
FD_ADDRESS_LIST _CHANGE | SIO_ADDRESS_LIST_CHANGE 컴맨드로 호출된 WSAIoctl

FD_READ, FD_OOB, 그리고 FD_ACCEPT 이벤트에 대한 메시지 포스팅 방법은 "level-triggered"라고 합니다. 무슨 말이냐구요? 만약 재활성화 루틴이 호출되고, 이와 관련된 상태가 루틴 호출후에도 여전히 남아 있다면, 메시지는 어플리케이션에 다시 포스팅 됩니다. 이러한 포스팅 방법으로 어플리케이션은 메시지 구동 방식이 됩니다. 아직 이해가 잘 않되시죠? 아래의 순서를 한번 생각해 보세요... 지금 제가 한말을 쉽게 이해 할 수 있을 겁니다.

1. 네트웍 전송/수신 스택이 소켓에 100 바이트의 데이터를 수신받고, 윈속이 FD_READ 메시지를 포스팅 했습니다.

2. 어플리케이션이 recv( s, buffer, 50, 0 )을 호출해서 50바이트를 수신했습니다.

3. 읽을 데이터가 여전히 남아있는 동안 FD_READ 메시지가 포스팅 됩니다.

이러한 구조상에서, 어플리케이션은 하나의 FD_READ 메시지에 대해서 모든 가능한 데이터를 읽어낼 필요가 없습니다. 각각의 FD_READ 메시지에 대해서 하나의 recv를 사용하는 것이 적절한 방법입니다. 만약 어플리케이션이 하나의 FD_READ에 대해서 여러개의 recv를 호출할 경우, 여러개의 FD_READ 메시지를 수신할 수도 있습니다. 이러한 어플리케이션에서는 recv함수를 호출하기전에 WSAAsyncSelect 함수를 FD_READ 이벤트를 셋팅하지 않는 방법으로 FD_READ 메시지 수신을 막아 버려야할 필요가 있습니다.

FD_QOS 그리고 FD_GROUP_QOS 이벤트는 "edge triggered"로 간주됩니다. 메시지는 Quality Of Service가 바뀌었을 때 정확히 한번 포스팅 됩니다. 게다가 메시지는 프로바이더가 QOS에서의 다른 변화를 감지하든지, 아니면, 어플리케이션이 소켓에 대한 QOS를 재설정할 때 까지 메시지는 수신되지 않습니다.

FD_ROUTING_INTERFACE_CHANGE 메시지는 SIO_ROUTING_INTERFACE_CHANGE 컴맨드로 WSAIoctl 함수가 호출될 때 포스팅 됩니다.

FD_ADDRESS_LIST_CHANGE 메시지는 SIO_ADDRESS_LIST_CHANGE 컴맨드로 WSAIoctl 함수가 호출될 때 포스팅 됩니다.

만약 어플리케이션이 WSAAsyncSelect함수를 호출하거나 재활성(re-enabling)함수를 호출했을 때 이미 이벤트가 발생되었다면, 이때의 메시지는 적절히 포스팅 됩니다. 이해를 쉽게 하기위해 아래의 일어날 수 순서 상황을 생각해 보세요.

1. 어플리케이션이 생성한 소켓에 대해서 listen 함수를 호출 했습니다.

2. 접속 요구가 들어왔으나 아직 accept 하지 않았습니다.

3. 어플리케이션은 이 소켓에 대해서 FD_ACCEPT로 WSAAsyncSelect 함수를 호출하였습니다. 이때 이벤트의 영속성이 보존되기 때문에 윈속은 FD_ACCEPT 메시지를 바로 포스팅 하게 됩니다.

FD_WRITE 이벤트는 약간 다르게 운용됩니다. 즉, 소켓이 connect/WSAConnect 함수의 호출로 첨 접속되었을 때, 또는 accept/WSAAccept 함수로 접속허용되었을 때, 또는, send 연산이 WSAEWOULDBLOCK 으로 실패(비동기소켓은 항상 WSAEWOULDBLOCK입니다)한 상태에서 전송용 버퍼공간이 사용 가능해졌을 때 FD_WRITE 메시지는 포스팅 됩니다. 따라서 어플리케이션은 FD_WRITE 메시지를 받았을 때 데이터의 전송이 가능하다고 판단 할 수 있습니다.

FD_OOB 이벤트는 소켓이 out-of-band 데이터를 부분적으로 수신하여 나열할 때만 사용됩니다. 만약 소켓이 out-of-band 데이터를 인라인 방식으로 수신하도록 나열 한다면, out-of-band데이터는 일반 데이터와 같이 다루어 지게 됩니다. 이때, 어플리케이션은 interest(?)를 등록해야 합니다. 일반데이터와 같이 다루어 진다는 의미는 뭔지 아시겠죠? FD_OOB 이벤트가 아닌 FD_READ이벤트가 발생했을 때 데이터를 수신한다는 의미입니다. 어플리케이션은 out-of-band 데이터가 SO_OOBINLINE 옵션으로 setsockopt함수나 getsockopt함수를 사용하여 핸들링 하는 방법을 설정할 수 있습니다.

FD_CLOSE 메시지의 에러코드는 소켓이 우아한닫힘(graceful close)인지 그렇지 않은 닫힘인지를 나타냅니다. 만약 에러코드가 0이라면, 소켓은 우아한닫힘 이라는 의미이고, 에러코드가 WSAECONNRESET 이라면, 소켓의 가상 회선망이 리셋되었다는 것을 의미합니다. 이러한 것들은 SOCK_STREAM과 같은 접속 지향형 소켓일 경우에만 사용될 수 있는 것들입니다.

FD_CLOSE 메시지는 소켓과 연관된 가상 회선망이 끊겼다는 것을 수신받았을 때 포스팅 됩니다. TCP 의 경우는 접속이 TIME WAIT 나 CLOSE WAIT 상태로 들어갔을 때 FD_CLOSE 메시지가 포스팅 되게 됩니다. 즉, 원격 종단점에서의 전송영역의 셧다운이나 closesocket 함수의 호출의 결과로 일어날 수 있는 메시지입니다. FD_CLOSE 메시지는 모든 데이터가 소켓으로부터 읽혀지고 난 후에 포스팅 됩니다 그렇긴 해도, 최대한 손실된 데이터들을 피하고자 한다면, FD_CLOSE 메시지를 받은 후에 남아있는 데이터들을 체크하는 것이 좋겠죠?

Return Values

지정된 네트웍 이벤트와 이벤트 객체가 성공적으로 설정되었으면, 함수는 0을 반환 합니다. 에러가 발생한 경우 SOCKET_ERROR을 리턴하고, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 났습니다.
WSAEINVAL | 함수의 매개변수가 잘못 사용되었습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1이 진행상태에 있거나, 서비스 프로바이더가 아직 콜백함수를 진행하고 있습니다.
WSAENOTSOCK | 지정된 소켓기술자가 소켓이 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSAAsyncSelect, WSACloseEvent, WSACreateEvent, WSAEnumNetworkEvents, WSAWaitForMultipleEvents


WSAGetLastError

WSAGetLastError 함수는 가장 최근에 일어난 실패한 소켓연산의 에러코드를 얻어내는 함수입니다.

int WSAGetLastError (void);

Remarks

WSAGetLastError 함수는 마지막으로 발생한 네트웍 에러를 반환합니다. 특정한 윈도우 소켓이 에러가 발생되면, 이 함수는 그에 적절한 에러코드를 반환하게되죠. 이 에러코드는 getsockopt 함수를 SO_ERROR 옵션으로 호출해서 얻은 에러코드와는 다를 수 있으니 염두해 두도록 하시구요. WSAGetLastError 는 다중쓰레드 어플리케이션이 경우 모든 쓰레드의 소켓에 대해서 동작을 하게 된다는 점두 염두해 두도록 합시다.

성공적인 소켓 함수의 호출이라든지, WSAGetLastError의 호출은 에러코드를 리셋하지 않습니다. 에러코드를 리셋하고 나중에 다시 사용하기 위해서는 WSAGetLastError 함수를 iError 매개변수를 0으로하여 호출해야 합니다. SO_ERROR 옵션으로 호출된 getsockopt 함수또한 0으로 호출해서 에러코드를 리셋해야만, 다음에 정확한 에러코드를 얻을 수 있다는점! 중요한 부분이니까. 꼭! 꼭! 꼭! 염두해 두도록 합시다.

그리고 비동기 네트웍 통지 메시지를 받을 때 메시지의 lParam으로 오는 에러값은 WSAGetLastError함수로 얻어낸 에러값과 다를 수 있으므로 이 두 에러값을 비교해서 서로 체크하는 것은 무의미 하다는 것을 또한 염두해 두도록 합시다.

Return Values

함수의 반환값은 마지막 윈도즈 소켓 연산의 에러코드를 의미합니다.

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

overview , getsockopt , WSASetLastError


WSAGetOverlappedResult

WSAGetOverlappedResult 함수는 매개변수로 지정한 소켓에 대한 오버랩 연산의 결과를 반환하는 함수 입니다.

BOOL WSAGetOverlappedResult (
SOCKET s,
LPWSAOVERLAPPED lpOverlapped,
LPDWORD lpcbTransfer,
BOOL fWait,
LPDWORD lpdwFlags
);

Parameters

s
[입력] 소켓을 식별하는 기술자입니다. 이 소켓은 WSARecv, WSARecvFrom, WSASend, WSASendTo 또는 WSAIoctl 함수를 호출할 때 지정한 소켓과 같은 소켓입니다.

lpOverlapped
[입력] 오버랩 연산이 시작될 때 지정된 WSAOVERLAPPED 구조체에 대한 포인터

pcbTransfer
[출력] 전송이나 수신 연산 또는 WSAIoctl 함수에 의해서 실제적으로 송/수신된 바이트의 갯수를 받는 32비트 변수에 대한 포인터

fWait
[입력] fWait 매개변수는 오버랩 연산을 완료하기위해 대기할 것인지를 결정하는 플래그입니다. 만약 이 값이 TRUE라면, 함수는 작업이 완료될 때까지 반환하지 않습니다. 만약 이 매개변수가 FALSE이고 연산이 여전히 기다림 상태라면, 이 함수는 FALSE를 반환하고, WSAGetLastError 함수는 WSA_IO_INCOMPLETE 에러코드를 반환 할 것입니다. fWait 매개변수는 오버랩 연산이 이벤트 기반의 완료통지로 선택 되었을 경우만 TRUE로 설정되어야 합니다.

lpdwFlags
[출력] 작업 완료 상태를 가진 한 개 또는 여러개의 플래그를 수신할 32비트의 변수에 대한 포인터입니다. 만약 오버랩 연산이 WSARecv 나 WSARecvFrom 으로 시작되었다면, 이 매개변수는 lpFlags 매개변수에 대한 결과 값을 가지고 있게 됩니다.

Remarks

WSAGetOverlappedResult 함수는 지정된 소켓에 대해서 마지막 오버랩 연산의 결과를 알려줍니다. 이 함수는 오버랩 함수를 호출했을 때 지정되어 사용된 소켓 기술자와 WSAOVERLAPPED 구조체를 넘겨 받습니다. 작업중인 연산은 연산을 시작한 함수가 FALSE를 반환했을 때 알려지게 되고, WSAGetLastError 함수는 WSA_IO_PENDING을 반환하게 됩니다. WSARecv 함수와 같은 I/O 연산이 기다림 상태일 때, 연산을 시작한 함수는 신호받지 않은 상태를 위해 WSAOVERLAPPED 구조체의 hEvent 멤버를 리셋합니다. 그런후... 대기하고 있던 연산이 작업을 완료 했을 때 시스템은 신호받은 상태를 표시하기 위해서 이벤트 객체를 설정하게 됩니다.

만약 fWait 매개변수가 TRUE라면, WSAGetOverlappedResult 함수는 기다리고 있는 연산이 신호받은 상태로 완료되었는지 아닌지를 결정하게 됩니다. 클라이언트는 I/O 연산이 요청되어 졌을 때 이벤트 기반의 완료 통지를 선택했을 경우만 fWait 매개변수를 TRUE로 설정 합니다. 만약 다른 형태의 통지가 선택되어 졌다면, WSAOVERLAPPED 구조체의 hEvent 매개변수의 사용법은 다를 것입니다. 그리고, fWait 매개변수를 TRUE로 설정하는 것은 예기치 않은 결과를 가져올 수 있습니다.

Return Values

함수가 성공적으로 수행된다면, TRUE를 반환하게 됩니다. 이렇게 함수가 성공적으로 수행 되었다는 의미는 오버랩 연산이 성공적으로 수행 되었다는 의미이고, lpcbTransfer 매개변수로 포인트된 값이 업데이트 되었다는 것을 의미합니다. 반면, 이 함수가 FALSE를 반환 했다는 의미는 오버랩 연산이 아직 완료되지 않았거나, 오버랩 연산이 완료되었으나 에러가 발생한 경우이거나, 오버랩 연산의 완료 상태가 WSAGetOverlappedResult 함수의 매개변수에 에러가 있어서 결정되지 못한 경우입니다. 이렇게 에러가 발생한 경우에 lpcbTransfer 매개변수는 업데이트 되지 않습니다. 이럴 때 세부적인 에러를 찾아내고자 한다면, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브 시스템에서 에러가 발생했습니다.
WSAENOTSOCK | 지정된 소켓이 소켓 기술자가 아닙니다.
WSA_INVALID_HANDLE | WSAOVERLAPPED 구조체의 hEvent 필드가 올바른 이벤트 객체 핸들을 포함하고 있지 않습니다.
WSA_INVALID_PARAMETER | 매개변수중 하나가 잘못되었습니다.
WSA_IO_INCOMPLETE | fWait 매개변수가 FALSE로 설정되어 있고, I/O 연산이 아직 완료되지 않았습니다.
WSAEFAULT | lpOverlapped, lpcbTransfer 또는 lpdwFlags 매개변수중에 잘못된 메모리 공간을 가지고 있는 매개변수가 있습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSAAccept , WSAConnect , WSACreateEvent , WSAIoctl , WSARecv , WSARecvFrom , WSASend , WSASendTo , WSAWaitForMultipleEvents


WSAHtonl

WSAHtonl 함수는 32bit(u_long) 크기의 호스트 바이트 오더를 네트웍 바이트 오더로 변환하는 함수입니다..

int WSAHtonl (
SOCKET s,
u_long hostlong,
u_long FAR * lpnetlong
);

Parameters

s
[입력] 소켓 기술자

hostlong
[입력] 호스트 바이트 오더인 32bit 수치

lpnetlong
[출력] 네트웍 바이트 오더인 32bit 수치에 대한 포인터

Remarks

WSAHtonl 함수는 호스트 바이트 오더의 32bit 수치를 가지고, 소켓 s 와 연관된 네트웍 바이트 오더로 lpnetlong 매개변수에 포인트된 32bit수치를 반환 하는 함수입니다.

Return Values

함수의 호출이 성공적인 경우 WSAHtonl 함수는 0을 반환합니다. 그렇지 않을 경우 SOCKET_ERROR 값을 반환합니다. 그리고 WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.
WSAENOTSOCK | 매개변수로 건네준 소켓이 정확한 소켓 기술자가 아닙니다.
WSAEFAULT | 매개변수로 건네준 lpnetlong 이 제대로 할당된 포인터가 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, htonl , htons, ntohl, ntohs, WSANtohl, WSAHtons, WSANtohs


WSAHtons

WSAHtons 함수는 16bi(u_short) 크기의 호스트 바이트 오더를 네트웍 바이트 오더로 변환하는 함수입니다.

int WSAHtons (
SOCKET s,
u_short hostshort,
u_short FAR * lpnetshort
);

Parameters

s
[입력] 소켓 기술자

hostshort
[입력] 호스트 바이트 오더인 16bit 수치

lpnetshort
[입력] 네트웍 바이트 오더인 16bit 수치를 얻어낼 포인터

Remarks

WSAHtons 함수는 16bit 인 호스트 바이트 오더를 가지고, 소켓 s 와 연관된 16bit인 네트웍 바이트 오더를 lpnetshort 매개변수에 포인트 하는 함수입니다.

Return Values

함수의 호출이 성공한 경우 WSAHtons 함수는 0을 반환 하고, 에러가 발생한 경우 SOCKET_ERROR을 반환합니다. 그리구... WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.
WSAENOTSOCK | 매개변수로 건네준 소켓이 정확한 소켓 기술자가 아닙니다.
WSAEFAULT | 매개변수로 건네준 lpnetshort 가 제대로 할당된 포인터가 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview , htonl , htons, ntohl, ntohs, WSAHtonl, WSANtohl, WSANtohs


WSAIoctl

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

int WSAIoctl (
SOCKET s,
DWORD dwIoControlCode,
LPVOID lpvInBuffer,
DWORD cbInBuffer,
LPVOID lpvOUTBuffer,
DWORD cbOUTBuffer,
LPDWORD lpcbBytesReturned,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

Parameters

s
[입력] 소켓을 식별하는 기술자

dwIoControlCode
[입력] 함수가 수행하는 연산의 제어코드

lpvInBuffer
[입력] 입력 버퍼에 대한 포인터

cbInBuffer
[입력] 입력 버퍼의 크기를 알리는 수치

lpvOutBuffer
[출력] 출력 버퍼에 대한 포인터

cbOutBuffer
[입력] 출력 버퍼의 크기를 알리는 수치

lpcbBytesReturned
[출력] 출력시 실제로 받아내는 바이트 수치를 포인트 합니다.

lpOverlapped
[입력] WSAOVERLAPPED 구조체의 포인터 (비동기 소켓에서는 무시됩니다)

lpCompletionRoutine
[입력] 연산이 완료 되었을 때 호출될 완료루틴(completion routine)의 포인터 (넌-오버랩 소켓에서는 무시됩니다.)

오늘은 정리하기 귀찮은 날!!! 이하생략!!!


WSAIsBlocking

윈도즈 소켓 블록화 연산이 진행 중인지 아닌지를 판단하는 함수입니다.

BOOL WSAIsBlocking( void );

Remarks

블록화 호출이 진행 중일 경우 WSAIsBlocking 함수는 TRUE를 반환하고, 그렇지 않을 경우 FALSE를 반환 합니다. WSAIsBlocking 함수를 사용함으로써 사용자가 블록화 윈도즈 소켓 기능을 사용하는 다른 네트워크 연산을 프로그램에서 시작 할 수 없도록 조치 할 수 있습니다. 블록화 호출이 진행 중일 때도 메시지는 애플리케이션으로 계속 디스패치 되기 때문에 사용자는 잠재적으로 하나의 메뉴 항목을 선책하거나 두 번재 네트워크 태스크를 시작할 수 있는 가속기를 호출할 수 있습니다. 예를들어, WM_INITMENUPOPUP 메시지가 수신될 때 애플리케이션은WSAIsBlocking 함수를 이용하여 네트워크 태스크를 호출하는 메뉴 항목들을 비활성화 하는 용도로도 사용될 수 있다는 말입니다.

그런데요... 이 함수는 윈속2(2.2.0)버젼 에서는 사용할 수 없는 함수가 되어 버렸습니다. WS2_32.DLL 라이브러리로는 export해서 사용할 수 없게 되었다는 말이죠. 즉, 윈속1.1을 사용하는 어플리케이션에서만 WINSOCK.DLL이나, WSOCK32.DLL을 로드해서 이 함수를 사용 할 수 있습니다.

Return Values

블록화 연산이 진행되고 있는 경우 TRUE, 그렇지 않은 경우 FALSE를 반환 합니다.

See Also

overview


WSAJoinLeaf

WSAJoinLeaf 함수는 멀티포인트 세션에 마지막 노드(leaf node)를 합치고(join), 접속 데이터를 교환하고, FLOWSPEC 구조체를 기반으로한 서비스의 특성(quality of service; QOS)를 지정하는 함수입니다.

SOCKET WSAJoinLeaf (
SOCKET s,
const struct sockaddr FAR * name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
DWORD dwFlags
);

Parameters

s
[입력] 멀티포인트 소켓을 식별하는 기술자

name
[입력] 합칠(join) 소켓의 상대방 이름

namelen
[입력] name 매개변수의 길이

lpCallerData
[입력] 멀티 포인트 세션이 완성되는 동안 상대방에게 전송할 유저 데이터의 포인터

lpCalleeData
[출력] 멀티 포인트 세션이 완성되는 동안 상대방으로부터 전송받을 유저 데이터의 포인터

lpSQOS
[입력] 소켓 s 에 대한 FLOWSPEC 구조체의 포인터

lpGQOS
[입력] 소켓 그룹에 대한 FLOWSPEC 구조체의 포인터(이 매개변수는 소켓그룹과 관련해서 훗날 사용하기 위해 존재하는 놈입니다.)

dwFlags
[입력] 소켓이 전송용으로 사용되는가, 수신용으로 사용되는가, 아니면, 양쪽 다 사용되는가를 알려주는 플래그

오늘은 정리하기 귀찮은 날!!! 이하생략!!!


WSANETWORKEVENTS

typedef struct _WSANETWORKEVENTS {
long lNetworkEvents;
int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

Parameters

lNetworkEvents
FD_XXX 네트웍 이벤트가 발생했음을 알리는 값

iErrorCodes
특정한 에러코드를 포함하는 배열로, INetworkEvents 의 이벤트 비트의 위치와 부합하는 배열 인덱스를 가집니다. FD_READ_BIT, FD_WRITE_BIT 그리고 다른 식별자들은 iErrorCodes 배열 인덱스를 이용할 수 있습니다.


WSANtohl

WSANtohl 함수는 32bit(u_long) 크기의 네트웍 바이트 오더를 호스트 바이트 오더로 변환하는 함수입니다.

int WSANtohl (
SOCKET s,
u_long netlong,
u_long FAR * lphostlong
);

Parameters

s
[입력] 소켓 기술자

netlong
[입력] 네트웍 바이트 오더인 32bit 수치

lphostlong
[출력] 호스트 바이트 오더인 32bit 수치에 대한 포인터

Remarks

WSANtohl 함수는 소켓과 연관된 네트웍 바이트 오더인 32bit 수치를 가지고, lphostlong 매개변수에 호스트 바이트 오더인 32bit 수치를 반환 하는 함수 입니다.

Return Values

함수의 호출이 성공적인 경우 WSAHtonl 함수는 0을 반환합니다. 그렇지 않을 경우 SOCKET_ERROR 값을 반환합니다. 그리고 WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.
WSAENOTSOCK | 매개변수로 건네준 소켓이 정확한 소켓 기술자가 아닙니다.
WSAEFAULT | 매개변수로 건네준 lphostlong 이 제대로 할당된 포인터가 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, htonl , htons, ntohl, ntohs, WSAHtonl, WSAHtons, WSANtohs


WSANtohs

WSANtohs 함수는 16bit(u_short)의 네트웍 바이트 오더를 호스트 바이트 오더로 변환하는 함수입니다.

int WSANtohs (
SOCKET s,
u_short netshort,
u_short FAR * lphostshort
);

Parameters

s
[입력] 소켓 기술자

netshort
[입력] 네트웍 바이트 오더인 16bit 수치

lphostshort
[출력] 결과를 받을 호스트 바이트 오더인 32bit 수치에 대한 포인터

Remarks

WSANtohs 함수는 소켓 s 와 연관된 16bit 네트웍 바이트 오더를 가지고, 호스트 바이트 오더로 변환하여 lphostshort 매개변수로 포인트 하는 함수입니다.

Return Values

함수가 성공적으로 수행된 경우 0을 반환하고, 에러가 발생한 경우 SOCKET_ERROR을 반환 합니다. 굴구, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에서 에러가 났습니다.
WSAENOTSOCK | 매개변수로 건네준 소켓이 정확한 소켓 기술자가 아닙니다.
WSAEFAULT | 매개변수로 건네준 lphostshort 가 제대로 할당된 포인터가 아닙니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview , htonl , htons, ntohl, ntohs, WSAHtonl, WSANtohl, WSAHtons


WSAOVERLAPPED

WSAOVERLAPPED 구조체는 오버랩 I/O 연산의 시작과 뒤이은 작업 완료의 사이에서의 통신수단을 제공합니다. WSAOVERLAPPED 구조체는 Win32 OVERLAPPED 구조체와 호환성이 있도록 디자인 되었습니다.

typedef struct _WSAOVERLAPPED {
DWORD             Internal;
DWORD             InternalHigh;
DWORD
            Offset;
DWORD             OffsetHigh;
WSAEVENT
     hEvent;
} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;

Members

Internal
이 예비 필드는 오버랩 I/O가 실행되는 곳에서 내부적으로 사용됩니다. 설치가능한 파일 시스템(IFS, Installable File System) 핸들인 소켓을 생성하는 서비스 프로바이더에서, 이 필드는 기본 운영체제에서 사용됩니다. 다른 서비스 프로바이더(IFS 프로바이더가 아닌)에서 필요할 때 이 필드는 자유로이 사용 할 수 있습니다.

InternalHigh
이 예비 필드는 오버랩 I/O가 실행되는 곳에서 내부적으로 사용됩니다. IFS 핸들인 소켓을 생성하는 서비스 프로바이더에서, 이 필드는 기본 운영체제에서 사용됩니다. IFS 가 아닌 프로바이더는 필요할 때 이 필드를 자유로이 사용할 수 있습니다.

Offset
이 필드는 서비스 프로바이더가 사용하기 위해 예약되어 있습니다.

OffsetHigh
이 필드는 서비스 프로바이더가 사용하기 위해 예약되어 있습니다.

Event
오버랩 I/O연산이 I/O 완료 루틴이 없는 상태에서 발생되었다면(lpCompletionRoutine 이 NULL일 경우), 이 필드는 올바른 WSAEVENT 객체나 NULL을 가져야 합니다. 반면, lpCompletionRoutine 이 NULL 이 아니라면, 어플리케이션은 필요한 경우 이 필드를 자유로이 사용할 수 있습니다.


WSAPROTOCOL_INFO

typedef struct _WSAPROTOCOL_INFOW {
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlags4;
DWORD dwProviderFlags;
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily;
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
WCHAR szProtocol[WSAPROTOCOL_LEN+1];
} WSAPROTOCOL_INFOW, FAR * LPWSAPROTOCOL_INFOW;

Members

dwServiceFlags1
프로토콜로 지원된 서비스들을 표현하는 비트마스크로, 아래에 나열한 값들이 사용됩니다.

    XP1_CONNECTIONLESS
    프로토콜은 비접속(데이터그램) 서비스를 지원합니다. 설정이 되어 있지 않다면, 프로토콜은 접속지향형 데이터 전송을 지원합니다.

    XP1_GUARANTEED_DELIVERY
    프로토콜은 모든 데이터가 원하는 목적지에 도달하도록 책임을 집니다.

    XP1_GUARANTEED_ORDER
    프로토콜은 전송한 데이터가 중복되지 않게 순서대로 도착하게 하는 책임을 집니다. 이러한 특성을 주었다고 데이터가 항상 성공적으로 전달되는 것은 아닙니다. 단지 전송된 데이터가 보내진 순서대로 전달되도록 하는 것입니다.

    XP1_MESSAGE_ORIENTED
    프로토콜은 메시지 제한(boundary) 개념이 없는 스트림 지향형 프로토콜(TCP)와 달리, 메시지 제한을 둡니다..

    XP1_PSEUDO_STREAM
    이 값은 메시지 지향형 프로토콜 이지만, 메시지 제한(boundary)은 모든 수신에 무시 됩니다. 이 값은 어플리케이션이 프로토콜에 의해서 완료된 메시지 프레임을 원하지 않을 때 편리하게 사용됩니다.

    XP1_GRACEFUL_CLOSE
    프로토콜은 두번의 절차(two-phase)를 거쳐서 종료하는 기능을 지원합니다. 이 값이 설정되지 않는다면, abort 종료만이 수행됩니다.

    XP1_EXPEDITED_DATA
    프로토콜은 긴급데이터의 처리를 지원합니다.

    XP1_CONNECT_DATA
    프로토콜은 접속 데이터를 지원합니다.

    XP1_DISCONNECT_DATA
    프로토콜은 디스컨넥트 데이터를 지원합니다.

    XP1_INTERRUPT
    예약된 비트입니다.

    XP1_SUPPORT_BROADCAST
    프로토콜은 브로트캐스트 매커니즘을 지원합니다.

    XP1_SUPPORT_MULTIPOINT
    프로토콜은 멀티포인트 또는 멀티캐스트 매커니즘을 지원합니다.

    XP1_MULTIPOINT_CONTROL_PLANE
    제어수준(control plane)이 루트(value=1)인지 루트가 아닌지(value=0)를 나타냅니다.

    XP1_MULTIPOINT_DATA_PLANE
    데이터 수준(data plane)이 루트(value=1)인지 루트가 아닌지(value=0)를 나타냅니다.

    XP1_QOS_SUPPORTED
    프로토콜은 서비스의 특성(QOS, Quality Of Service)요청을 지원합니다.

    XP1_UNI_SEND
    프로토콜은 전송시에 한쪽방향으로만 작동합니다.

    XP1_UNI_RECV
    프로토콜은 수신시에 한쪽방향에서만 작동합니다.

    XP1_IFS_HANDLES
    프로바이더에 의해서 반환되는 소켓 기술자는 운영 체체의 IFS(Installable File System)핸들 입니다.

    XP1_PARTIAL_MESSAGE
    MSG_PARTIAL 플래그는     WSASend 와 WSASendTo 함수에서 제공되어 집니다.

dwServiceFlags2
추가 프로토콜 속성 정의를 위해 예약되어 있습니다.

dwServiceFlags3
추가 프로토콜 속성 정의를 위해 예약되어 있습니다.

dwServiceFlags4
추가 프로토콜 속성 정의를 위해 예약되어 있습니다.

dwProviderFlags
프로토콜이 프로토콜 목록에서 어떻게 표현될 것인가에 대한 정보를 제공합니다. 아래의 값들이 사용될 수 있습니다.

    PFL_MULTIPLE_PROTO_ENTRIES
    여러 동작이 가능한 단일 프로토콜에 대한 한 개 또는 여러개의 면모중 하나가 있다는 것을 나타냅니다. 예를들어, 수신측에서의 SPX 프로토콜은 메시지 지향형이나, 스트림 지향형이나 동작할 수 있다는 것이죠.

    PFL_RECOMMENDED_PROTO_ENTRY
    여러 동작이 가능한 프로토콜에 대한 항목이 자주 사용되거나 권장됨을 나타냅니다.

    PFL_HIDDEN
    윈속 DLL을 나타내는 프로바이더에 의해서 설정됩니다. 이 프로토콜은     WSAEnumProtocols 함수에 의해서 생성되는 결과 버퍼를 반환하지 않습니다. 어쨌든 분명한건 윈속2 어플리케이션에서는 이 비트를 설정하는 항목을 볼순 없을 겁니다.

    PFL_MATCHES_PROTOCOL_ZERO
    socket 이나 WSASocket 함수에서 0 값을 가지는 프로토콜 매개변수가 이 프로토콜 항목과 일치 된다는 것을 나타냅니다.

ProviderId
전체적으로 볼 때 유일한 식별자는 서비스 프로바이더 벤더에 위한 프로바이더에 할당되어 집니다. 이 값은 여러개의 서비스 프로바이더가 가능한 곳에서 유용하게 사용될 수 있습니다.

dwCatalogEntryId
각각의 WSAPROTOCOL_INFO 구조체에 대한 윈도즈 소켓 DLL에 의해 할당되는 유일한 식별자.

iVersion
프로토콜 버전 식별자

iAddressFamily
이 구조체가 가리키는 프로토콜로 소켓을 개방하기 위해 socket/WSASocket 함수의 어드레스 집합(family) 매개변수를 넘기기위한 값입니다. 이 값은 또한 프로토콜 어드레스(SOCKADDR)를 유일하게 정의 합니다.

iMaxSockAddr
최대 어드레스 길이

iMinSockAddr
최소 어드레스 길이

iSocketType
이 프로토콜에 대한 소켓을 개방 하기위한 socket 함수를 호출할 때 넘길 소켓타입 매개변수 값입니다.

iProtocol
이 프로토콜에 대한 소켓을 개방 하기위한 socket 함수를 호출할 때 넘길 프로토콜 매개변수 값입니다.

iProtocolMaxOffset
socket 과 WSASocket 함수에 protocol 매개변수로 값을 지정할 때 iProtocol 에 더해지는 최대 값으로. 모든 프로토콜이 이 값의 범위를 허용하는 것은 아닙니다.

iNetworkByteOrder
"big-endian"나 "little-endian"인 상수값을 가집니다. (정의된 상수: BIGENDIAN, LITTLEENDIAN)

iSecurityScheme
보안 정책의 형태를 나타냅니다. SECURITY_PROTOCOL_NONE 값은 보안 정책을 구체적으로 세우지 않는 프로토콜에 사용됩니다.

dwMessageSize
이 프로토콜에서 제공되는 최대 메시지 크기입니다. 이 값은 최대의 메시지 크기가 정의되는 표준규정이 없습니다. 아래에 제시된 값은 특별히 정의되어 있습니다.

    0
    프로토콜이 스트림 지향형 이고, 따라서 메시지 크기에 대한 개념은 없습니다.

    0x1
    최대로 전송되는 메시지 크기가 기본 네트웍 MTU(Maximum sized Transmission Unit)에 달려있고, 따라서 소켓이 바인드 되기 전까지는 알 수 없습니다. 어플리케이션은 소켓이 로컬 어드레스와 바인드 되고 나서     getsockopt 함수를 이용해 SO_MAX_MSG_SIZE의 값을 얻어낼 수 있습니다.

    0xFFFFFFFF
    프로토콜이 메시지 지향형 이지만, 메시지를 전송하는데 최대크기라는 제한이 없음을 의미합니다.

dwProviderReserved
서비스 프로바이더가 사용하기 위해 예약 되어 있습니다.

szProtocol
프로토콜 번호를 읽기편한 이름으로 구성되어 있는 배열입니다. 일례로 "SPX2" 프로토콜 이름을 들 수 있죠. 이 배열의 최대 크기는 WSAPROTOCOL_LEN으로 정의 되어 있습니다. 즉, 최대 길이는 255 바이트 입니다.


WSARecv

WSARecv 함수는 접속된 상대방 소켓으로부터 날라온 데이터를 얻어내는 함수입니다.

int WSARecv (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

Parameters

s
[입력] 접속된 소켓의 기술자

lpBuffers
[입/출력] WSABUF 구조체의 배열 포인터로, 각각의 WSABUF 구조체는 데이터를 담은 버퍼와 버퍼의 길이를 가지게 됩니다.

dwBufferCount
[입력] lpBuffer 배열에 있는 WSABUF 구조체( 배열의 엘리먼트)의 개수

lpNumberOfBytesRecvd
[출력] 데이터 수신 작업이 바로 완료된 경우, 이 함수의 호출로 읽어낸 데이터의 바이트 수를 포인트 합니다.

lpFlags
[입/출력] 어떠한 방식으로 이 함수를 호출할 것인가를 나타내는 플래그

lpOverlapped
[입력] WSAOVERLAPPED 구조체의 포인터 ( 넌-오버랩 소켓에서는 무시됩니다)

lpCompletionRoutine
[입력] 수신 작업이 완료되었을 때 호출될 완료 루틴의 포인터 (넌-오버랩드 소켓에서는 무시됩니다.)

Remarks

WSARecv 함수는 recv 함수와 비교해볼 때, 기능적으로 아래의 3가지 면에서 더 많은 기능을 지원합니다.

1. 오버랩(굳이 울나라말로 하자면, "동시다중" 이라고 해야 하나요?) 수신 연산을 수행하기 위해서 오버랩 소켓과 연동하여 사용될 수 있습니다.

2. 수집/분산 I/O 작업을 하기 위해서 여러개의 수신버퍼를 사용할 수 있습니다.

3. lpFlag 매개변수는 입력용과 출력용 매개변수로 사용될 수 있습니다. 이 플래그로 MSG_PARTIAL 플래그 비트의 상태를 감지할 수 있지만, MSG_PARTIAL 플래그는 모든 프로토콜에서 지원되는 것은 아닙니다.

WSARecv 함수는 s 매개변수로 지정된 접속된 소켓이나 바인드된 접속되지 않은 소켓에 대해서, 들어오는 데이터를 읽어내는데 사용합니다. 소켓에 지정된 로컬 어드레스는 반드시 알려지 것이어야 합니다. 서버 어플리케이션에서는 보통 bind 함수나, accept 또는 WSAAccept 함수를 사용하여 로컬어드레스를 묶어줍니다. 클라이언트 어플리케이션에서는 connect, WSAConnect, sendto, WSASendTo 함수나, WSAJoinLeaf 함수를 사용하여 로컬 어드레스를 묶어주게 됩니다.

오버랩 소켓에서, WSARecv 함수는 들어오는 데이터를 한 개 또는 그이상의 버퍼에 붙여 넣도록 사용할 수 있습니다. 만약 작업이 바로 끝날 수 없는 상황 이라면, 마지막 완료 상태는 완료루틴(completion routine)이나, WSAGetOverlappedResult 함수를 사용해 얻어낼 수 있습니다.

lpOverlapped 와 lpCompletionRoutine 매개변수가 모두다 NULL 이라면, 이 함수에서 지정된 소켓은 넌-오버랩 소켓처럼 다루어 질 것입니다.

넌-오버랩 소켓에서 이 함수가 사용된다면, 블록킹 처리부분은 표준 recv 함수와 같은 의미로 동작하게 됩니다. 굴구... lpOverlapped 와 lpCompletionRoutine 매개변수는 무시됩니다. 이미 수신되고 버퍼링된 데이터는 함수를 호출할 때 지정했던 사용자 버퍼에 카피될 것입니다. 블록킹 소켓에서 수신된 데이터도 없고, 버퍼링된 데이터도 없는 경우 이 함수를 호출했다면, 읽을 데이터가 상대방으로부터 날라올 때 까지 블록킹에 걸리게 됩니다. 윈속2 에서는 이 함수를 사용하는데 있어서 기본적인 블록킹 타임아웃 매커니즘을 정의하고 있지는 않습니다. (허걱~ 치명적이다...)

바이트-스트림 프로토콜(TCP)과 같은 프로토콜에 대해서 스택은 제공된 버퍼공간에 가능한 많은 데이터를 반환 하려고 시도합니다. 하지만, 단일 바이트의 수신작업은 콜러를 블록킹 시키지 않을 만큼 충분합니다. 단일 바이트이상이 반환 된다고 하는 보장은 없습니다. 메시지 지향형과(UDP) 같은 프로토콜 에서는 콜러를 블록킹에 걸리지 않게 하기 위해서 가득찬 메시지가 필요합니다. - ㅠㅠ 아~ 오늘도 컨디션이 않좋은 걸까? 왜이리 해석이 껄끄럽단 말입니까. 아래에 원문을 담았습니다. - 초 허접 날림 번역 -

<원문>For protocols acting as byte-stream protocols the stack tries to return as much data as possible subject to the supplied buffer space and amount of received data available. However, receipt of a single byte is sufficient to unblock the caller. There is no guarantee that more than a single byte will be returned. For protocols acting as message-oriented, a full message is required to unblock the caller.

프로토콜이 바이트-스트림으로 동작하건 그렇지 않던간에, WSAPROTOCOL_INFO 구조체에 XPI_MESSAGE_ORIENTED 와 XPI_PSEUDO_STREAM 을 설정해서, 그리구, 이함수의 플래그 매개변수에 MSG_PARTIAL 플래그를 설정해서 이 함수가 어떤 프로토콜로 동작하는지 결정됩니다. 아래의 테이블이 이와 관련된 조합에 대해서 요약 해 놓았습니다. ( 별표(*)는 사용하지 않는다는 의미 입니다)

XP1_MESSAGE_ORIENTED | XP1_PSEUDO_STREAM | MSG_PARTIAL | Acts as
not set | * | * | byte-stream
* | set | * | byte-stream
set | not set | set | byte-stream
set | not set | not set | message-oriented

lpBuffers 매개변수로 지정되는 WSABUF 구조체의 배열은 임시적입니다. 오버랩 방식에 의해서 WSARecv 함수가 완료되었다면, 이 함수를 반환 하기전에 WSABUF 구조체의 내용을 캐쳐/카피 해 놓는 일은 서비스 프로바이더의 책임입니다. 이렇게 함으로써 어플리케이션은 스택기반의 WSABUF 구조체 배열을 사용할 수 있게 되는 것입니다.

SOCK_STREAM 과 같은 바이트 스트림 형식의 소켓에서, 들어오는 데이터는, 버퍼가 가득 찰 때 까지, 또는 접속이 종료될 때 까지, 또는, 내부의 버퍼링된 데이터를 다 써 버릴 때 까지 버퍼에 채워지게 됩니다. 들어오는 데이터가 모든 버퍼에 채워지건 말건 관계없이 작업완료의 알림은 오버랩 소켓에 대해서 발생하게 됩니다.

SOCK_DGRAM 과 같은 메시지 지향형 소켓에서, 들어오는 메시지는 제공된 버퍼의 총 크기에 이르기까지 제공된 버퍼에 채워지게 됩니다. 굴구, 작업완료의 알림이 지정된 오버랩 소켓에 대해서 발생하게 됩니다. 메시지가 지정된 버퍼의 크기보다 더 큰 경우, 버퍼는 처음 메시지의 시작 부분부터 버퍼에 채워지게 됩니다. 만약 MSG_PARTIAL 기능이 서비스 프로바이더에서 지원이 된다면, MSG_PARTIAL 플래그를 lpFlags 에 설정하고, 바로 다음에 나머지 메시지를 수신할수 있게 됩니다. MSG_PARTIAL 이 지원되지 않지만, 프로토콜이 신뢰성이 있다면, WSARecv 함수는 WSAEMSGSIZE 에러코드를 발생할 것이고, 바로 다음으로 보다 더 큰 버퍼를 사용해 모든 데이터를 얻어낼 수 있게 됩니다. 그렇지 않은 경우( 프로토콜이 신뢰성이 없고, MSG_PARTIAL을 지원하지 않는다면) 초과된 데이터는 손실되게 됩니다. 그리고, WSARecv 함수는 WSAEMSGSIZE 에러코드를 발생하게 됩니다.

접속 지향형 소켓에서 WSARecv 함수는 스트림 소켓(SOCK_STREAM)이건 메시지 지향 소켓(SOCK_DGRAM) 이건, 가상연결망의 우아한 종료("graceful termination" : 가장 이상적인 종료를 말하는 대명사)의 발생을 알아 낼 수 있습니다. 무슨 말이냐 하면, 스트림 소켓에서 0 바이트를 읽었다면(함수가 0을 리턴하고, lpNumberOfBytesRecvd 매개변수가 0으로 된 경우죠), 소켓이 우아한 종료를 했다 라고 판단할 수 있는 것입다. 메시지 지향형 소켓(SOCK_DGRAM)의 경우 0 바이트의 메시지를 수신하고, WSAECONNRESET 에러코드가 발생하였다면, 소켓이 우아한 종료(graceful closure)를 했다 라는 것을 알 수 있게 됩니다. 소켓이 강제리셋 된 경우는 WSAECONNRESET 이라는 에러코드가 발생하게 된다는 것을 참고로 알아둡시다.

lpFlags 매개변수는 WSARecv 함수가 동작하게될 구체적인 작업에 대해서 명시하는데 사용하는 플래그입니다. 이 값은 아래에 나열된 값을 OR 연산해서 설정하게 됩니다. 즉, 이 함수가 동작하는 내용은 소켓옵션과 lpFlags 매개변수에 의해서 결정된다고 볼 수 있습니다.

Value | Meaning
MSG_PEEK | 들어오는 데이터를 살짝 엿보기만 합니다. 데이터는 함수에서 지정한 버퍼로 카피되지만, 입력 큐 로부터 제거되지는 않습니다. 이 플래그는 넌-오버랩 소켓에서만 가능합니다.
MSG_OOB | out-of-band 데이터를 처리하기 위해 사용됩니다.
MSG_PARTIAL | 이 플래그는 메시지 지향형 소켓에서만 가능합니다. 수신받은 데이터는 전송한 데이터의 일부분입니다. 읽지 않고 남아있는 메시지의 일부분은 바로 뒤 따라오는 수신 연산에서 읽혀질 것입니다. 입력 매개변수로 사용될 때, 수신연산이 서비스 프로바이더에 의해서 메시지의 일부분만이 수신되었다 하더라도 수신 연산이 완료했다 라는 것을 알려주게 됩니다.

메시지 지향형 소켓에서, MSG_PARTIAL 플래그 비트는, 메시지중 일부분이 수신 되었다면, lpFlags 매개변수에 플래그가 설정되게 됩니다. 만약 완료 메시지가 수신되었다면, MSG_PARTIAL 은 lpFlags 에서 사라지게 됩니다. 작업의 완료가 잠시 뒤로 미루어진 경우, lpFlags 매개변수에 의해서 포인트된 값은 업데이트 되지 않습니다. 작업의 완료가 알려졌을 때, 어플리케이션은 WSAGetOverlappedResult 함수를 호출해서 작업의 결과를 얻어낼 수 있고, lpdwFlags 매개변수로 작업완료 알림 플래그를 검색할 수 있습니다.

Overlapped socket I/O

오버랩 연산이 바로 완료 되었다면, WSARecv 함수는 0 값을 반환하고, lpNumberOfBytesRecvd 매개변수는 읽어낸 바이트의 수를 가지고 업데이트 됩니다. 그리고, 플래그 비트는 lpFlags 매개변수로 또한 업데이트 됩니다. 오버랩 연산이 성공적으로 시작되고, 나중에 작업이 완료될 예정이라면, WSARecv 함수는 SOCKET_ERROR를 반환하고, WSA_IO_PENDING 에러코드를 발생하게 됩니다. 이러한 경우에, lpNumberOfBytesRecvd 매개변수와 lpFlags 매개변수는 업데이트 되지 않습니다. 나중에 오버랩 연산이 완료 되었을 때, 수신받은 데이터의 크기는 완료루틴의 cbTransferred 매개변수나 WSAGetOverlappedResult 함수의 lpcbTransfer 매개변수에 의해서 알려지게 됩니다. 플래그 값은 WSAGetOverlappedResult 함수의 lpdwFlags 매개변수를 검사해서 얻어낼 수 있습니다.

WSARecv 함수는 이전에 호출되었던 WSARecv, WSARecvFrom, WSASend, WSASendTo 함수의 완료 루틴의 내부에서 호출될 수 있습니다. 이러한 것이 가능 함으로써 선점형 흐름으로써 시간에 민감한 데이터의 전송은 가능하게 됩니다.

lpOverlapped 매개변수는 오버랩 연산이 일어나고 있는 동안 그값을 올바르게 유지해야 합니다. 만약 여러개의 I/O연산이 동시에 발생된다면, 각각의 연산은 각기 분리된 WSAOVERLAPPED 구조체를 참조해야 합니다.

만약 lpCompletionRoutine 매개변수가 NULL 이라면, lpOverlapped 의 hEvent 필드는 오버랩 연산이 완료되었을 때 신호를 받게 됩니다. (물론 hEvent 필드는 제대로 된 이벤트 객체여야 하겠죠?) 어플리케이션은 이벤트객체로 대기하거나 폴링 하기 위해서 WSAWaitForMultipleEvents 함수나 WSAGetOverlappedResult 함수를 사용할 수 있습니다.

만약 lpCompletionRoutine 매개변수가 NULL이 아니라면, hEvent 필드는 무시되고, 어플리케이션은 완료루틴을 위해서 흐름정보를 넘줄 수 있습니다.

lpCompletionRoutine 매개변수를 NULL이 아닌 값으로 넘겨주고, 나중에 같은 오버랩 I/O 요청을 위해 WSAGetOverlappedResult 함수를 호출하는 콜러는 WSAGetOverlappedResult 함수의 결과를 TRUE로 하기위해 fWait 매개변수를 설정하지 않습니다. 이러한 경우 hEvent 필드의 사용법은 정의되어 있지 않습니다. 그리고, hEvent 이벤트 객체에 대해서 대기하려고 하는 시도는 예기지 않은 결과를 초래 할 수도 있습니다.

완료루틴(completion routine)은 Win32 파일 I/O에서 규정된 것과 같은 방식을 따릅니다. 완료루틴은 WSAWaitForMultipleEvents 함수가 fAlertable 매개변수를 TRUE로 하여 호출될 때 발생되는 것과 같이 쓰레드의 대기상태를 감지할 수 있는(alertable) 상태가 될 때까지 호출되지 않습니다.

완료루틴의 프로토타입은 아래와 같습니다.

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

CompletionRoutine 함수는 어플리케이션 지정 또는 라이브러리 지정 함수 이름을 가집니다. dwError 매개변수는 lpOverlapped 매개변수에 의해서 나타낸 오버랩 연산에 대한 완료 상태를 명시합니다. cbTransferred 매개변수는 전송한 바이트의 수를 명시합니다. 일반적으로 flag 값은 정의되어 있지 않고, dwFlags 는 0을 사용합니다.

Return Values

에러가 발생하지 않고, 전송연산이 바로 완료되었다면, WSARecv 함수는 0을 반환 합니다. 이러한 경우에 완료루틴은 호출쓰레드가 반응할 수 있는(alertable) 상태로 호출되기 위한 준비를 이미 같추었다고 볼 수 있습니다. 에러가 발생한 경우 SOCKET_ERROR 값이 반환 됩니다. 그리고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAENOTCONN | 지정된 소켓이 접속된 소켓이 아닙니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다.
WSAENETRESET | 작업이 진행되고 있는 도중에 에러상황이 검출되어서 접속이 해제 되었습니다.
WSAENOTSOCK | 지정한 소켓 기술자가 소켓기술자가 아닙니다.
WSAEFAULT | lpBuffer 매개변수가 올바른 메모리 어드레스를 가지고 있지 않습니다.
WSAEOPNOTSUPP | MSG_OOB 플래그가 지정되었으나, 소켓이 SOCK_STREAM 과 같은 타입의 스트림 형태의 소켓이 아닌 경우 이거나, 소켓이 out-of-band 데이터를 지원하지 않는 형태의 소켓입니다. 그리고, MSG_PARTIAL 형태가 지원되지 않거나, 소켓이 단방향 이어서 데이터 수신 연산만을 지원하는 형태입니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다. 소켓에 대해서 shutdown 함수를 호출한 후에는 WSARecv 함수를 사용할 수 없습니다.
WSAEWOULDBLOCK | 오버랩 소켓 : 너무많은 오버랩 I/O가 발생했습니다. 넌-오버랩 소켓 : 소켓이 비동기 소켓일 경우 전송 연산이 바로 완료될 수 없습니다. ( 언젠가는 완료가 될 것이므로 확실한 에러상황이라고 볼 수 없죠.)
WSAEMSGSIZE | 메시지가 지정된 버퍼에 들어가기에 너무 큽니다. 그리고, 신뢰성없은 프로콜의 경우에, 버퍼에 저장되지 않은 나머지 데이터는 잃어 버리게 됩니다.
WSAEINVAL | 소켓이 바인드 되어 있지 않습니다.
WSAECONNABORTED | 가상 연결망이 타임아웃이나 그밖의 에러로 끊겨버렸습니다.
WSAECONNRESET | 가상 연결망이 원격지 상대방에 의해서 리셋 되었습니다.
WSAEDISCON | 소켓 s가 메시지 지향형 소켓이고, 가상 연결망이 원격지에 의해서 우아하게 종료 되었습니다.
WSA_IO_PENDING | 오버랩 연산이 성공적으로 시작되었고, 작업은 지금 완료될 수 없지만, 곧 완료될 것입니다.
WSA_OPERATION_ABORTED | 오버랩 연산이 소켓의 종료 때문에 취소 되었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent, WSACreateEvent, WSAGetOverlappedResult, WSASocket, WSAWaitForMultipleEvents


WSARecvEx

WSARecvEx 함수는 flags 매개변수가 입력/출력용 매개변수라는 점을 제외하고는 기존 recv 함수와 같은 기능을 합니다. 데이터그램 프로토콜을 사용해서 전체 메시지가 아닌 일부분만을 수신할 때, flags 매개변수에 MSG_PARTIAL 플래그가 설정되게 됩니다.

int PASCAL FAR WSARecvEx (
SOCKET s,
char FAR* buf,
int len,
int* flags
);

Parameters

s
[입력] 접속된 소켓을 식별하는 소켓 기술자

buf
[출력] 들어오는 데이터를 받아낼 버퍼

len
[입력] buf 매개변수의 길이

flags
[입력/출력] 데이터 그램 소켓에서 수신한 메시지가 통째로 수신되었는지 일부분만 수신되었는지를 식별하는 플래그

Remarks

윈도즈 소켓2에서 준비된 함수중 하나인 WSARecvEx 함수는 flags 매개변수가 입/출력 용으로 사용된다는 점을 제외하고는 recv 함수와 유사합니다. recv 함수에서의 flags 는 입력용으로만 사용되었었죠. 암튼, 이 추가적인 출력용 매개변수는 메시지 지향형 프로토콜을 사용할 때 메시지 전체가 수신되었는지 일부분만 수신 되었는지를 알아내는데 사용됩니다. 즉, 기존의 recv 함수는 각각의 recv 함수의 호출로 단일 메시지 만을 수신한데 반해서 WSARecvEx 함수는 지정한 버퍼로 다 담을 수 없을 크기의 메시지도 수신할 수 있다는 기능을 추가 하게된 것입니다.

WSARecvEx 함수는 스트림 지향형 프로토콜 에서는 recv 함수와 똑같이 사용됩니다.

그밖에 msdn에서는 여러 가지 설명을 하고 있는데, 별로 중요한 것 같지 않아서 그만 생략 합니다. 부가적인 정보를 더 원하신다면, msdn을 참고 하시기 바랍니다. 물론 해석은 본인이 부담하셔야죠. ^^

Return Values

에러가 발생하지 않는다면, WSARecvEx 함수는 수신된 바이트의 길이를 반환합니다. 만약 접속이 종료되었다면(close), 0을 반환하게 됩니다. 추가로 몇마디 하자면, 메시지 지향형 프로토콜에서 일부분의 메시지를 수신한 경우 flags 매개변수에서 MSG_PARTIAL 비트는 설정되게 됩니다. 반면, 완전한 메시지가 수신된다면, flags 매개변수에 MSG_PARTIAL 비트는 설정되지 않습니다.

에러가 발생한 경우 SOCKET_ERROR을 반환하게 되고 WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | buf 매개변수가 제대로 할당된 메모리 공간을 가지고 있지 않습니다.
WSAENOTCONN | 소켓이 접속되어 있지 않습니다.
WSAEINTR | WSACancelBlockingCall 함수에 의해서 작업이 종료되었습니다.
WSAEINPROGRESS | 블록킹 윈속1.1 호출이 현재 처리중에 있거나, 서비스 프로바이더가 아직 콜백함수를 처리하고 있습니다.
WSAENETRESET | 접속이 상대방 호스트의 리셋으로 인하여 종료되었습니다.
WSAENOTSOCK | 지정한 기술자가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 가 지정되었으나 소켓의 SOCK_STREAM과 같은 형태의 스트림 형식의 소켓이 아니고, out-of-band 데이터가 지원되지 않습니다. 또는 지정한 소켓이 단일 방향으로 전송용으로만 사용되는 소켓입니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK | 소켓이 비동기 소켓으로 마킹되어 있고, 수신연산이 바로 완료될 수 없는 경우 입니다.
WSAEINVAL | 소켓이 바인드 되어 있지 않거나, 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE을 활성화 시킨 상태에서 MSG_OOB를 지정햇습니다. 또는 len 매개변수가 0 이거나 음수 입니다.
WSAECONNABORTED | 가상 연결망이 타임아웃이나 다른이유로 끊겨(terminate) 버렸습니다.
WSAETIMEDOUT | 접속이 네트웍 오류나 상태방 시스템의 오류로 끊겨(drop) 버렸습니다.
WSAECONNRESET | 가상 연경망이 상대방의 "hard" 또는 "abortive" 종료를 수행하여 끊겨(reset) 버렸습니다.

QuickInfo

Windows NT : 사용가능
Windows CE : 지원하지 않습니다.
Header : mswsock.h.
Import Library : mswsock.lib.

See Also

overview, recvfrom, select, send, socket, WSAAsyncSelect


WSARecvFrom

WSARecvFrom 함수는 데이터그램을 수신하고, 데이터를 보내는 곳(source) 의 어드레스를 저장(store)하는 함수입니다.

int WSARecvFrom (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
struct sockaddr FAR * lpFrom,
LPINT lpFromlen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

Parameters

s
[입력] 작업 대상 소켓 기술자

lpBuffers
[입력/출력] WSABUF 구조체의 배열 포인터로써, 각각의 WSABUF 구조체는 버퍼의 포인터와 이 버퍼의 길이를 가지게 됩니다.

dwBufferCount
[입력] lpBuffers 배열에 있는 WSABUF 엘리먼트의 개수

lpNumberOfBytesRecvd
[출력] 함수의 호출 후에 수신연산이 바로 종료될 경우, 수신된 바이트의 수치를 포인트 합니다.

lpFlags
[입력/출력] 플래그를 위한 포인터

lpFrom
[출력] 데이터를 보낸 출발지 어드레스를 포인트 하기위한 SOCKADDR 구조체의 포인터

lpFromlen
[입력/출력] lpFrom 매개변수가 지정되었을 때만 사용되는 매개변수로 lpFrom의 크기를 위한 포인터

lpOverlapped
[입력] WSAOVERLAPPED 구조체의 포인터 (넌-오버랩 소켓에서는 무시됩니다.)

lpCompletionRoutine
[입력] 수신 연산이 완료되었을 때 호출되는 완료루틴의 포인터 (넌-오버랩 소켓에서는 무시됩니다.)

Remarks

WSARecvFrom 함수는 표준 recvfrom 함수와 비교할 때 아래의 3가지 면에서 볼 때 더 많은 기능을 제공합니다.

1. 오버랩 수신 연산을 수행하기 위해서 오버랩 소켓과 연동하여 사용됩니다.

2. 이 함수는 수집/분산 형태의 I/O를 가능하게 하기위하여 여러개의 수신버퍼를 사용할 수 있습니다.

3. lpFlags 매개변수는 입력용과 출력용의 매개변수로 사용되어, MSG_PARTIAL 의 상태를 출력시 감지할 수 있게 됩니다. 하지만, MSG_PARTIAL 플래그 비트는 모든 프로토콜에 대해서 지원되지 않는다는점! 꼭 명심하시기 바랍니다.

WSARecvFrom 함수는 본질적으로 매개변수 s 에 지정된 비접속 지향형 소켓(SOCK_DGRAM)에 사용됩니다. 소켓의 로컬 어드레스는 확실히 알 수 있는 것이여야 하는데요. 서버 어플리케이션에서는 확실한 로컬어드레스를 바인딩 하기위해서 bind 함수를 사용해서 호출합니다. 이러게 명시적으로 bind 함수를 호출하는 방식은 클라이언트 프로그램에서는 무용지물이 될 수 있습니다. 일반적으로 클라이언트 어플리케이션에서는 sendto, WSASendTo, 또는 WSAJoinLeaf 함수를 사용해서 묵시적으로 로컬어드레스 지정하게 됩니다.

오버랩 소켓에서, 이 함수는 소켓으로 들어오는 데이터를 버퍼링 하기위해서 한 개 또는 그 이상의 버퍼를 사용 할 수 있습니다. 이렇게 데이터를 버퍼링 한 수에 어플리케이션에서 지정된 작업완료 루틴(or 신호)는 발생 됩니다. 여기서 말하는 작업완료 루틴(or 신호)란 완료함수(completion routine)나, 이벤트 오브젝트를 말하는 겁니다. 연산이 바로 완료되지 않는다면, 마지막 완료 상태는 위에서 언급한 완료루틴(completion routine)이나, WSAGetOverlappedResult 함수를 통해 반환됩니다. 또한, lpFrom 매개변수와 lpFromlen 매개변수의 값은 작업이 완료되어 완료 신호를 받을때 까지 업데이트 되지 않습니다. 어플리케이션에서는 이 값들이 업데이트 되기 전에 이 값들을 건드리면 안 됩니다.

lpOverlapped 와 lpCompletionRoutine 매개변수가 둘 다 NULL 일 경우, 이 함수에 사용된 소켓은 넌-오버랩 소켓으로 간주되어 처리됩니다.

넌-오버랩 소켓에서의 블록킹 처리부분은 WSARecv 함수의 그것과 같습니다. 그리고 lpOverlapped 와 lpCompletionRoutine 매개변수는 무시됩니다. 트랜스포트(계층)에서 이미 수신되고, 버퍼링된 데이터는 함수에 지정한 버퍼로 카피됩니다. 아무런 데이터가 들어오지 않은 상태에서 이 함수를 호출하게 되면, 다른 데이터가 들어올 때 까지 함수를 블록 합니다.

lpBuffers 매개변수로 지정되는 WSABUF 매개변수의 배열은 임시공간입니다. 오버랩 방식으로 이 함수가 호출되었다면, 함수가 반환하기전에 WSABUF 구조체를 캡쳐하는 일은 서비스 프로바이더의 몫입니다. 이렇게 함으로써 어플리케이션은 스택기반(쉽게 말해서 배열이죠)으로 WSABUF 배열을 사용할 수 있는 것입니다.

비접속 지향형 소켓타입에서, 데이터를 보내는 상대방의 어드레스는 lpFrom 매개변수에 의해서 지정된 버퍼로 카피됩니다. lpFromlen 매개변수는 함수를 호출할 때 넘겨주는 lpFrom 의 크기를 지정해 주고, 이 함수의 연산이 완료 되었을 때 lpFrom 매개변수로 실제로 저장된 데이터의 크기를 포인트 하게 됩니다. 오버랩 소켓에서 lpFrom 과 lpFromlen 매개변수는 오버랩 I/O 가 완료될 때 까지 업데이트 되어서는 절대로 안 됩니다. 그러므로, 이 매개변수로 포인트된 메모리는 서비스 프로바이더에서 사요가능하도록 남겨두어야 하면, 어플리케이션 스택 프레임에 할당하지 말아야 합니다. 결국 동적할당 하라는 말이겠죠. lpFrom 과 lpFromlen 매개변수는 접속지향형 소켓에서는 무시됩니다.

SOCK_STREAM 과 같은 바이트 스트림 소켓의 경우, 들어오는 데이터는 버퍼가 가득 찰 때 까지나, 접속이 끊길 때까지, 아니면, 내부버퍼 데이터(internally beffered data)를 다 써 버릴 때 까지 지정된 버퍼에 채워지게 됩니다. 오버랩 소켓에서 들어오는 데이터가 모든 버퍼에 채워지든 채워지지 않든간에, 작업이 완료 되었다는 알림은 발생합니다. SOCK_DGRAM 과 같은 메시지 지향형 소켓의 경우, 들어오는 메시지는 지정된 버퍼의 총 크기에 이르기 까지 지정된 버퍼에 채워지게 됩니다. 그리고 오버랩 소켓에 대해서 작업 완료 알림은 발생하게 됩니다. 만약 메시지가 지정된 버퍼보다 더 크다면, 버퍼엔 들어온 메시지중 처음부터 지정된 크기만큼만이 채워지게 됩니다.

MSG_PARTIAL 부분은 서비스 프로바이더를 기반으로 지원되는 플래그입니다. MSG_PARTIAL 플래그는 lpFlags 에 설정되고, 뒤 따라오는 수신 연산은 메시지의 rest(중간부분?)를 얻어낼 것입니다. 만약 MSG_PARTIAL 이 지원되지 않지만, 프로토콜이 믿을 만한 것이라면, WSARecvFrom 함수는 WSAEMSGSIZE 에러를 발생시키고, 더 큰 버퍼를 사용여, 뒤 따라오는 수신 연산은 전체의 메시지를 얻어내는데 사용될 수 있습니다. 이와 다른 경우(MSG_PARTIAL을 지원하지 않고, 프로토콜이 신뢰성이 없는 경우)는 초과된 데이터는 잘려 버리게 됩니다. 그리고, WSARecvFrom 함수는 WSAEMSGSIZE 에러를 발생합니다.

lpFlags 매개변수는 WSARecvFrom 함수가 동작하게될 구체적인 작업에 대해서 명시하는데 사용하는 플래그입니다. 이 값은 아래에 나열된 값을 OR 연산해서 설정하게 됩니다. 즉, 이 함수가 동작하는 내용은 소켓옵션과 lpFlags 매개변수에 의해서 결정된다고 볼 수 있습니다.

Value | Meaning
MSG_PEEK | 들어오는 데이터를 살짝 엿보기만 합니다. 데이터는 함수에서 지정한 버퍼로 카피되지만, 입력 큐 로부터 제거되지는 않습니다. 이 플래그는 넌-오버랩 소켓에서만 가능합니다.
MSG_OOB | out-of-band 데이터를 처리하기 위해 사용됩니다.
MSG_PARTIAL | 이 플래그는 메시지 지향형 소켓에서만 가능합니다. 수신받은 데이터는 전송한 데이터의 일부분입니다. 읽지 않고 남아있는 메시지의 일부분은 바로 뒤 따라오는 수신 연산에서 읽혀질 것입니다. 입력 매개변수로 사용될 때, 수신연산이 서비스 프로바이더에 의해서 메시지의 일부분만이 수신되었다 하더라도 수신 연산이 완료했다 라는 것을 알려주게 됩니다.

메시지 지향형 소켓에서, MSG_PARTIAL 플래그 비트는, 메시지중 일부분이 수신 되었다면, lpFlags 매개변수에 플래그가 설정되게 됩니다. 만약 완전한 메시지가 수신되었다면, MSG_PARTIAL 은 lpFlags 에서 사라지게 됩니다. 작업의 완료가 잠시 뒤로 미루어진 경우, lpFlags 매개변수에 의해서 포인트된 값은 업데이트 되지 않습니다. 작업의 완료가 알려졌을 때, 어플리케이션은 WSAGetOverlappedResult 함수를 호출해서 작업의 결과를 얻어낼 수 있고, lpdwFlags 매개변수로 작업완료 알림 플래그를 검색할 수 있습니다.

Overlapped socket I/O

오버랩 연산이 바로 완료 되었다면, WSARecvFrom 함수는 0 값을 반환하고, lpNumberOfBytesRecvd 매개변수는 읽어낸 바이트의 수를 가지고 업데이트 됩니다. 그리고, 플래그 비트는 lpFlags 매개변수로 또한 업데이트 됩니다. 오버랩 연산이 성공적으로 시작되고, 나중에 작업이 완료될 예정이라면, WSARecvFrom 함수는 SOCKET_ERROR를 반환하고, WSA_IO_PENDING 에러코드를 발생하게 됩니다. 이러한 경우에, lpNumberOfBytesRecvd 매개변수와 lpFlags 매개변수는 업데이트 되지 않습니다. 나중에 오버랩 연산이 완료 되었을 때, 수신받은 데이터의 크기는 완료루틴의 cbTransferred 매개변수나 WSAGetOverlappedResult 함수의 lpcbTransfer 매개변수에 의해서 알려지게 됩니다. 플래그 값은 WSAGetOverlappedResult 함수의 lpdwFlags 매개변수를 검사해서 얻어낼 수 있습니다.

WSARecvFrom 함수는 이전에 호출되었던 WSARecv, WSARecvFrom, WSASend, WSASendTo 함수의 완료 루틴의 내부에서 호출될 수 있습니다. 이러한 것이 가능 함으로써 선점형 흐름으로써 시간에 민감한 데이터의 전송은 가능하게 됩니다.

lpOverlapped 매개변수는 오버랩 연산이 일어나고 있는 동안 그값을 올바르게 유지해야 합니다. 만약 여러개의 I/O연산이 동시에 발생된다면, 각각의 연산은 각기 분리된 WSAOVERLAPPED 구조체를 참조해야 합니다.

만약 lpCompletionRoutine 매개변수가 NULL 이라면, lpOverlapped 의 hEvent 필드는 오버랩 연산이 완료되었을 때 신호를 받게 됩니다. (물론 hEvent 필드는 제대로 된 이벤트 객체여야 하겠죠?) 어플리케이션은 이벤트객체로 대기하거나 폴링 하기 위해서 WSAWaitForMultipleEvents 함수나 WSAGetOverlappedResult 함수를 사용할 수 있습니다.

만약 lpCompletionRoutine 매개변수가 NULL이 아니라면, hEvent 필드는 무시되고, 어플리케이션은 완료루틴을 위해서 흐름정보를 넘줄 수 있습니다.

lpCompletionRoutine 매개변수를 NULL이 아닌 값으로 넘겨주고, 나중에 같은 오버랩 I/O 요청을 위해 WSAGetOverlappedResult 함수를 호출하는 콜러는 WSAGetOverlappedResult 함수의 결과를 TRUE로 하기위해 fWait 매개변수를 설정하지 않습니다. 이러한 경우 hEvent 필드의 사용법은 정의되어 있지 않습니다. 그리고, hEvent 이벤트 객체에 대해서 대기하려고 하는 시도는 예기지 않은 결과를 초래 할 수도 있습니다.

완료루틴(completion routine)은 Win32 파일 I/O에서 규정된 것과 같은 방식을 따릅니다. 완료루틴은 WSAWaitForMultipleEvents 함수가 fAlertable 매개변수를 TRUE로 하여 호출될 때 발생되는 것과 같이 쓰레드의 대기상태를 감지할 수 있는(alertable) 상태가 될 때까지 호출되지 않습니다.

완료루틴의 프로토타입은 아래와 같습니다.

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

CompletionRoutine 함수는 어플리케이션 지정 또는 라이브러리 지정 함수 이름을 가집니다. dwError 매개변수는 lpOverlapped 매개변수에 의해서 나타낸 오버랩 연산에 대한 완료 상태를 명시합니다. cbTransferred 매개변수는 전송한 바이트의 수를 명시합니다. 일반적으로 flag 값은 정의되어 있지 않고, dwFlags 는 0을 사용합니다.

Return Values

에러가 발생하지 않고, 전송연산이 바로 완료되었다면, WSARecvFrom 함수는 0을 반환 합니다. 이러한 경우에 완료루틴은 호출쓰레드가 반응할 수 있는(alertable) 상태로 호출되기 위한 준비를 이미 같추었다고 볼 수 있습니다. 에러가 발생한 경우 SOCKET_ERROR 값이 반환 됩니다. 그리고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEFAULT | lpBuffers, lpFlags, lpFrom, lpNumberOfBytesRecvd, lpFromlen, lpOverlapped, 또는 lpCompletionRoutine 매개변수가 제대로된 사용자 어드레스 공간을 가지고 있지 않습니다 : lpFrom 버퍼가 상대방 어드레스를 담기에 너무 작은 경우에도 이 에러코드를 발생합니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다.
WSAEINVAL | 소켓이 바이드 되지 않았습니다.
WSAEISCONN | 소켓이 접속되어 있습니다. 이 함수는 접속지향형 소켓이건, 비접속 지향 소켓이건 접속된 소켓을 허용하지 않습니다.
WSAENETRESET | 작업이 진행되고 있는 도중에 에러가 검출되어 접속이 깨져버렸습니다.
WSAENOTCONN | 소켓이 접속되지 않았습니다. ( 접속 지향형 소켓일 경우만 ) 컥~~~ 이건 또 무슨 소리냐... WSAEISCONN 에서는 접속된 소켓을 허용하지 않는다면서... ㅠㅠ
WSAEOPNOTSUPP | MSG_OOB 플래그가 지정되었으나, 소켓이 SOCK_STREAM 과 같은 타입의 스트림 형태의 소켓이 아닌 경우 이거나, 소켓이 out-of-band 데이터를 지원하지 않는 형태의 소켓입니다. 그리고, MSG_PARTIAL 형태가 지원되지 않거나, 소켓이 단방향 이어서 데이터 수신 연산만을 지원하는 형태입니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다. 소켓에 대해서 shutdown 함수를 호출한 후에는 WSARecvFrom 함수를 사용할 수 없습니다.
WSAEWOULDBLOCK | 오버랩 소켓 : 너무많은 오버랩 I/O가 발생했습니다. 넌-오버랩 소켓 : 소켓이 비동기 소켓일 경우 전송 연산이 바로 완료될 수 없습니다. ( 언젠가는 완료가 될 것이므로 확실한 에러상황이라고 볼 수 없죠.)
WSAEMSGSIZE | 메시지가 지정된 버퍼에 들어가기에 너무 큽니다. 그리고, 신뢰성없은 프로콜의 경우에, 버퍼에 저장되지 않은 나머지 데이터는 잃어 버리게 됩니다.
WSAECONNRESET | 가상 연결망이 원격지 상대방에 의해서 리셋 되었습니다.
WSAEDISCON | 소켓 s가 메시지 지향형 소켓이고, 가상 연결망이 원격지에 의해서 우아하게 종료 되었습니다.
WSA_IO_PENDING | 오버랩 연산이 성공적으로 시작되었고, 작업은 지금 완료될 수 없지만, 곧 완료될 것입니다.
WSA_OPERATION_ABORTED | 오버랩 연산이 소켓의 종료 때문에 취소 되었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent , WSACreateEvent , WSAGetOverlappedResult , WSASocket , WSAWaitForMultipleEvents


WSAResetEvent

WSAResetEvent 함수는 지정된 이벤트 객체를 신호받지 않은 상태로 리셋 하는 함수입니다.

BOOL WSAResetEvent(
WSAEVENT hEvent
);

Parameters

hEvent
[입력] 신호받지 않은 상태로 설정할 이벤트 객체 핸들

Remarks

WSAResetEvent 함수는 지정된 이벤트 객체를 신호받지 않은 상태로 리셋 하는데 사용하는 함수입니다. 이 함수는 Win32 ResetEvent 함수의 호켓버젼이라고 생각하시면 됩니다.

Return Values

함수가 성공적으로 수행된다면 TRUE를 반환하고, 실패한다면, FALSE를 반환 합니다. 또한 WSAGetLastError 함수를 호출해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSA_INVALID_HANDLE | hEvent 매개변수가 올바른 이벤트 객체 핸들이 아닙니다.

QuickInfo

Windows NT : 사용가능
 Windows : 사용가능
Windows CE : 지원하지 않음
Header :
Win32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent , WSACreateEvent , WSASetEvent


WSASend

WSASend 함수는 접속된 상대방 소켓에게 지정한 데이터를 보내는 함수입니다.

int WSASend (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

Parameters

s
[입력] 접속된 소켓을 가리키는 소켓 기술자

lpBuffers
[입력] WSABUF 구조체의 포인터. WSABUF 구조체는 버퍼의 포인터와 퍼퍼의 길이를 나타내는 멤버로 구성되는 구조체로 이 구조체의 배열을 포인트 해서 넘겨줍니다.

dwBufferCount
[입력] lpBuffer 배열로 지정된 WSABUF 구조체의 갯수

lpNumberOfBytesSent
[출력] 이 함수의 호출로 인해서 전송된 바이트의 갯수를 포인트 합니다.

dwFlags
[입력] 어떻한 방식으로 전송을 수행 할 것인지 설정하는 플래그

lpOverlapped
[입력] WSAOVERLAPPED 구조체의 포인터 ("넌오버랩" 소켓에 대해서는 무시됩니다.)

lpCompletionRoutine
[입력] 전송연산이 완료되었을 때 호출되는 전송완료 루틴에 대한 포인터입니다. ("넌오버랩" 소켓에서는 무시됩니다.)

Remarks

WSASend 함수는 기존의 send 함수의 기능을 모두 다 수행 하면서, 아래의 두가지 항목을 추가적으로 지원합니다.

1. 중복된 전송 연산을 수행하도록 중복(overlapped)소켓을 가지고 작업할 수 있는 기능

2. 여러개의 전송 버퍼를 두어 전송 할 수 있는 기능

WSASend 함수는 s 매개변수로 로 지정된 접속지향형 소켓에서 한 개 또는 그 이상의 데이터를 전송 하기위해서 사용하는 함수입니다. 이 함수는 비접속 지향형 소켓(SOCK_DGRAM 과 같은 소켓이겠죠?) 에서도 사용 가능합니다. 하지만, 이렇게 사용하려 하는 경우에, 소켓은 connect 함수나 WSAConnect 함수에 의해서 상대방 어드레스가 지정되어 있어야 합니다.

오버랩 소켓(WSASocket 함수를 WSA_FLAG_OVERLAPPED 플래그를 두어 생성한 소켓)은 오버랩 입/출력을 사용하여 정보를 전송하게 됩니다. 하지만, lpOverlapped 와 lpCompleteRoutine 매개변수가 NULL인 경우 소켓은 넌-오버랩 소켓으로 간주되어 처리되게 됩니다.

전송하는데 지정된 버퍼가 다 사용되었을 때 완료루틴이 호출되거나, 이벤트 객체가 셋팅되는 방식으로 작업이 완료 되었다는 것을 알 수 있습니다. 만약 작업이 바로 완료되지 않는 경우엔 완료루틴이나, WSAGetOverlappedResult 함수에 의해서 마지막 완료 상태를 얻어낼 수 있습니다.

넌-오버랩 소켓에서는 마지막 두 매개변수(lpOverlapped, lpCompletetionRoutine)은 무시됩니다. 그리고, WSASend 함수는 send 함수와 같은 동작을 하도록 사용되어 집니다. 데이터는 지정된 버퍼로부터 전송버퍼로 복사됩니다. 만약 소켓이 비동기 모드인 스트림 소켓이고, 전송버퍼에 충분한 공간이 남아있지 않다면, WSASend 함수는 전송하는데 사용되었던 버퍼 만큼만을 반환 할 것입니다. 블록킹 소켓의 경우는 전송버퍼 공간이 남아서 지정된 버퍼를 전송버퍼로 다 복사 할 때 까지 블록킹 됩니다.

lpBuffers 매개변수에 의해서 포인트되는 WSABUF 구조체 배열은 일시적인 공간입니다. 전송연산이 오버랩 처리를 완료했다면, 이 공간은 서비스 프로바이더의 책임입니다. 즉, WSASend 함수가 반환하기전에 이 WSABUF 구조체를 서비스 프로바이더가 캡쳐해야 하는 것이죠. 이러한 처리방식은 WSABUF 배열을 스택기반으로 이루어질 수 있도록 하게 됩니다.

메시지 지향형 소켓(비접속 지향형 소켓)의 경우 서비스 프로바이더에서 지원할 수 있는 메시지의 최대 크기를 넘지 않도록 조심해야 합니다. 이 최대값은 SO_MAX_MSG_SIZE 옵션으로 얻어낼 수 있죠. 만약 전송할 데이터가 전송하기에 너무 큰데이터라면, WSAEMSGSIZE 라는 에러를 반환 하게 됩니다. 글구... 아무런 데이터도 전송되지 않게 됩니다.

Note : WSASend 함수를 성공적으로 수행 했다고 해서 데이터가 성공적으로 상대방에게 전송되었다고 확신 할 수는 없습니다.

dwFlags 매개변수는 함수를 호출했을 때 어떻게 데이터를 전송할 것인지 세부적인 함수의 행동을 설정하는데 사용하는 값입니다. 즉, 이 함수의 동작을 결정하는 것은 소켓 옵션과 dwFlags 매개변수라고 할 수 있습니다. dwFlag 매개변수에 들어가는 값은 아래에 제시한 값들을 OR 로 구성하여 넘겨주면 됩니다.

Value | Meaning
MSG_DONTROUTE | 데이터를 라우팅하도록 하지 않도록 명시합니다. 윈도즈 소켓 서비스 프로바이더는 이 플래그를 무시할 수 있습니다.
MSG_OOB | SOCK_STREAM으로 생성한 연결지향형 소켓에서 out-of-band 데이터를 전송하는데 사용되는 값입니다.
MSG_PARTIAL | lpBuffers 매개변수가 부분적인 메시지만을 담도록 명시합니다. 만약 부분적인 메시지 전송을 지원하지 않는 경우에는 WSAEOPNOTSUPP 에러코드를 반환 할 것입니다.

Overlapped socket I/O

오버랩 연산이 바로 완료 되었다면, WSASend 함수는 0 값을 반환 합니다. 그리고, lpNumberOfBytesSent 매개변수는 전송된 바이트의 수를 포인트 합니다. 오버랩 연산이 성공적으로 시작되었으나, 나중에 완료될 것이라면, WSASend 함수는 SOCKET_ERROR을 반환하고, WSA_IO_PENDING 이라는 에러코드를 발생할 것입니다. 이러한 경우에 lpNumberOfBytesSent 매개변수는 전송된 값을 포인트 하지 않습니다. 오버랩 연산이 완료되었을 때, 전송된 데이터의 수치는 완료루틴의 cbTransferred 매개변수나 WSAGetOverlappedResult 함수의 lpcbTransfer 매개변수를 가지고 알 수 있습니다.

WSASend 함수는 이전에 호출한 WSARecv, WSARecvFrom, WSASend, WSASendTo 함수들의 완료함수 내부에서 호출될 수 있습니다.

만약 여러개의 I/O 연산이 동시에 일어난 다면, 각각의 연산은 서로다른 WSAOVERLAPPED 구조체를 참조해야 합니다.

lpCompletionRoutine 매개변수가 NULL이라면, lpOverlapped 매개변수의 hEvent 필드는 오버랩 연산이 완료 되었을 때 신호를 받게 됩니다. 어플레케이션은 WSAWaitForMultipleEvents 나 WSAGetOverlappedResult 함수를 사용해서 이벤트 객체에 대해서 대기하거나 폴링할 수 있습니다.

lpCompletionRoutine 매개변수가 NULL이 아니 이라면, hEvent 필드는 무시되고, 완료루틴을 위한 흐름정보(context information)를 사용할 수 있게 됩니다. 이렇게 NULL 이 아닌 lpCompletionRoutine 을 넘겨주는 콜러와 나중에 같은 오버랩 I/O 요청을 위해 호출되는 WSAGetOverlappedResult 함수는 WSAGetOverlappedResult 함수를 TRUE로 호출하기위한 fWait 맵개변수를 셋팅하지 않습니다. 이러한 경우에 hEvent 필드를 사용하는 특별한 방법은 정의되지 않습니다. 그리고, hEvent 필드를 사용해 대기하려 하면, 예측할 수 없는 결과를 가져 올 수도 있습니다.

완료루틴은 Win32 파일 I/O 완료루틴과 같은 규칙을 따르게 됩니다. 완료루틴은 WSAWaitForMultipleEvents 함수가 fAlertable 매개변수를 TRUE로 설정하여 호출될 때와 같이 작업쓰레드가 반응할수있는(alertable) 대기 상태에 있을 때 까지 호출되지 않을 것입니다.

완료루틴의 프로토타입은 아래와 같습니다.

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

CompletionRoutine 함수는 어플리케이션-정의 또는 라이브러리 정의 함수 이름으로 사용됩니다. dwError 매개변수는 lpOverlapped 에 의해서 표현되는 오버랩 연산에 대한 완료의 상태를 가리킵니다. cbTransferred 매개변수는 전송한 데이터의 바이트 수를 나타냅니다. 일반적으로 dwFlags 매개변수는 잘 사용되지 않습니다. 이값은 0 값을 가지게 될 것입니다. 이 함수는 반환값이 없습니다.

Return Values

에러가 발생하지 않고, 전송연산이 바로 완료되었다면, WSASend 함수는 0을 반환 합니다. 이러한 경우에 완료루틴은 호출쓰레드가 반응할 수 있는(alertable) 상태로 호출되기 위한 준비를 이미 같추었다고 볼 수 있습니다. 에러가 발생한 경우 SOCKET_ERROR 값이 반환 됩니다. 그리고, WSAGetLastError 함수를 호출해 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEACCES | 지정된 어드레스는 브로드캐스팅 어드레스 인데, 적절한 플래그가 사용되지 않았습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다.
WSAEFAULT | lpBuffers, lpNumberOfBytesSent, lpOverlapped, lpCompletionRoutine 매개변수가 올바른 어드레스를 넘기지 않았습니다.
WSAENETRESET | 작업이 진행되고 있는 도중에 에러상황이 검출되어서 접속이 해제 되었습니다.
WSAENOBUFS | 버퍼 사용중 데드락에 걸렸습니다.
WSAENOTCONN | 지정된 소켓이 접속된 소켓이 아닙니다.
WSAENOTSOCK | 지정한 소켓 기술자가 소켓기술자가 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 플래그가 지정되었으나, 소켓이 SOCK_STREAM 과 같은 타입의 스트림 형태의 소켓이 아닌 경우 이거나, 소켓이 out-of-band 데이터를 지원하지 않는 형태의 소켓입니다. 그리고, MSG_PARTIAL 형태가 지원되지 않거나, 소켓이 단방향 이어서 데이터 수신 연산만을 지원하는 형태입니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다. 소켓에 대해서 shutdown 함수를 호출한 후에는 WSASend 함수를 사용할 수 없습니다.
WSAEWOULDBLOCK | 오버랩 소켓 : 너무많은 오버랩 I/O가 발생했습니다. 넌-오버랩 소켓 : 소켓이 비동기 소켓일 경우 전송 연산이 바로 완료될 수 없습니다. ( 언젠가는 완료가 될 것이므로 확실한 에러상황이라고 볼 수 없죠.)
WSAEMSGSIZE | 소켓이 메시지지향 소켓(SOCK_DGRAM)일때, 전송하려는 데이터의 크기가 지원되는 최대 크기보다 더 큽니다.
WSAEINVAL | 소켓이 bind 함수로 바인드 되지 않았거나, 소켓이 오버랩 플래그를 사용해서 생성되지 않았습니다.
WSAECONNABORTED | 가상 연결망이 타임아웃이나 그외 다른 에러상황으로 끊겨 버렸습니다.
WSAECONNRESET | 가상 연결망이 상대방에 의해서 리셋되었습니다.
WSA_IO_PENDING | 오버랩 연산이 성공적으로 시작되었고, 작업이 잠시 후에 완료될 예정입니다.
WSA_OPERATION_ABORTED | 오버랩 연산이 소켓의 닫힘 때문에 취소되었거나, SO_FLUSH 컴맨드로 WSAIoctl 함수를 수행해서 연산이 도중에 취소 되었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent, WSACreateEvent, WSAGetOverlappedResult, WSASocket, WSAWaitForMultipleEvents


WSASendTo

WSASendTo 함수는 오버랩 I/O를 사용하여 지정된 목적지로 데이터를 전송하는 함수입니다.

int WSASendTo (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
const struct sockaddr FAR * lpTo,
int iToLen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

Parameters

s
[입력] 대상 소켓(접속된 소켓도 상관없습니다.)의 기술자.

lpBuffers
[입력] WSABUF 구조체의 배열에 대한 포인터로, 각각의 WSABUF 구조체는 데이터를 담은 버퍼와 버퍼의 길이를 가지고 있습니다. 이 배열공간은 전송 작업이 끝날 때 까지 비워져서는 않됩니다.

dwBufferCount
[입력] lpBuffers 배열에 있는 WSABUF 구조체의 갯수

lpNumberOfBytesSent
[출력] I/O 연산이 바로 완료된 경우, 이 함수의 호출로 전송된 데이터의 바이트 수를 포인트 합니다.

dwFlags
[입력] 어떠한 방식으로 이 함수를 호출할 건지 지정합니다.

lpTo
[입력] 목적지 소켓의 어드레스를 지정하는 추가적인 포인터

iToLen
[입력] lpTo 어드레스의 크기

lpOverlapped
[입력] WSAOVERLAPPED 구조체의 포인터 (넌-오버랩 소켓에서는 무시됩니다.)

lpCompletionRoutine
[입력] 전송연산이 완료되었을 때 호출될 완료루틴에 대한 포인터 (넌-오버랩 소켓에서는 무시됩니다.)

Remarks

WSASendTo 함수는 기능적인 두가지 측면에서 기본 sendto 함수보다 더 많은 기능을 지원합니다.

1. 오버랩 전송 연산을 수행하기 위하여 오버랩 소켓과 결합하여 사용할 수 있습니다.

2. 수집/분산 형태의 입출력을 할 수 있는 여러개의 전송버퍼를 사용할 수 있습니다.

WSASendTo 함수는 일반적으로 비접속 지향형 소켓(매개변수 s 로 지정)을 사용하여 지정된 상대방 소켓(매개변수 lpTo 로 지정)에 한 개 또는 그 이상의 버퍼로 데이터그램을 전송할 수 있습니다. 비접속소켓(SOCK_DGRAM)이 이전에 connect 함수를 이용해서 접속되어 있었다 하더라도, lpTo 매개변수는 특정한 데이터그램에 대해서 이전에 지정한 목적지 어드레스를 무시합니다. 접속지향형 소켓의 경우 lpTo 와 iToLen 매개변수는 무시됩니다. 이러한 경우에 WSASendTo 함수는 WSASend 함수와 동일하게 동작합니다.

오버랩 소켓(WSASocket 함수를 WSA_FLAG_OVERLAPPED 플래그를 써서 생성한 소켓)은 오버랩 입/출력을 사용하여 데이터를 전송합니다. 하지만, lpOverlapped 와 lpCompletetionRoutine 두 매개변수가 NULL 인 경우는 오버랩 입/출력을 사용하여 데이터를 전송하지 않습니다. 이러한 경우 소켓은 넌-오버랩 소켓으로 간주되어 동작하게 됩니다. 작업 완료의 알림(완료루틴이 호출되거나, 이벤트 오브젝트가 셋팅되어서 알려지게 됨)은 함수의 호출시 매개변수로 제공된 버퍼를 전송하는데 다 사용했을 경우 발생됩니다. 전송 연산이 바로 완료되지 못하는 경우라면, 마지막 완료 상태는 완료루틴(completion routine)이나 WSAGetOverlappedResult 함수로 얻어낼 수 있습니다.

위에서도 잠시 설명했지만, lpOverlapped 와 lpCompletionRoutine 매개변수 두다 NULL 일 경우, 이 함수에서 사용하는 소켓은 넌-오버랩 소켓으로 간주되어 다루어집니다. 꼭 명심하고 넘어 가자구요.

넌-오버랩 소켓에서 이함수를 사용할 경우(즉, 첫 번째 매개변수로 넌-오버랩 소켓을 넘긴다는 얘깁니다) 마지막 두 매개변수(lpOverlapped, lpCompletionRoutine)은 무시되고, WSASendTo 함수는 send 함수와 같이 처리되게 됩니다. 데이터는 건네준 버퍼로부터 전송버퍼로 카피되게 되는데, 만약 소켓이 비동기 스트림 소켓일 경우 전송버퍼의 공간이 부족하게 될 수 도 있습니다. 이러한 경우에 넘겨준 데이터의 일부분만 전송하게 되는데, 결국 이 함수가 반환하는 값도 넘겨준 전체 데이터에서 전송하는데 사용된 일부분의 데이터의 수 만을 반환 하게 됩니다. 하지만, 블록킹 소켓에서는 꽉 차있는 전송버퍼가 다 소비될 때 까지 블록 하게 됩니다.

lpBuffers 매개변수로 나타내어지는 WSABUF 구조체의 배열은 일시적(임시적)입니다. 만약 이 함수의 연산이 오버랩 으로 처리된다면, 함수가 리턴되기 전에 이 배열(WSABUF 배열)을 캡쳐 해 놓는일은 서비스 프로바이더가 알아서 해줍니다. 이러한 방식으로 내부가 구현되기 때문에, 어플리케이션은 스택형태인 WSABUF 배열로 전송할 데이터를 넘겨줄 수 있게 되는 것입니다.

메시지 지향형 소켓(SOCK_DGRAM)의 경우 전송하는 데이터그램의 크기가 지원하는 최대 크기에서 벗어나지 않도록 신경을 써야 합니다. 소켓이 지원하는 데이터그램의 최대크기는 SO_MAX_MSG_SIZE 의 값으로 얻어낼 수 있습니다. 만약 전송하려는 데이터가 너무 크다면, WSAEMSGSIZE라는 에러값이 리턴될 것이고, 전송을 이루어지지 않게 됩니다.

WSASendTo 함수를 성공적으로 호출했다고, 데이터가 성공적으로 전송되었다는 보장은 없습니다.

dwFlags 매개변수는 소켓에 지정된 옵션외에 함수의 호출이 수행할 것을 지정하는데 사용됩니다. 즉, 이 함수가 어떠한 작업을 할 것인지는 소켓옵션과 dwFlags 매개변수에 의해서 결정됩니다. dwFlags 매개변수로 넘겨줄 값은 아래에 제시된 값들을 OR 연산해서 구성된 값을 사용합니다.

Value | Meaning
MSG_DONTROUTE | 데이터가 라우팅되지 않도록 하기위해 명시합니다. 윈도즈 소켓 서비스 프로바이더는 이 플래그를 무시할 수 있습니다.
MSG_OOB | out-of-band 데이터를 전송합니다. (SOCK_STREAM 과 같은 소켓에 사용)
MSG_PARTIAL | lpBuffers 매개변수가 단지 부분 메시지(partial message) 만을 다룬다고 명시합니다. WSAEOPNOTSUPP 에러코드는 이러한 부분 메시지 전송을 지원하지 않는 전송형태에서 MSG_PARTIAL 플래그를 사용할 때 발생한다는 점을 명심 해 둡시다.

Overlapped socket I/O

오버랩 연산이 바로 완료가 되었다면, WSASendTo 함수는 0값을 리턴합니다. 그리고, lpNumberOfBytesSent 매개변수는 전송된 바이트의 수치로 업데이트 됩니다. 오버랩 연산이 성공적으로 시작되었지만, 오버랩 연산이 나중에 완료될 것이라면, WSASendTo 함수는 SOCKET_ERROR을 반환 하고, WSA_IO_PENDING 이라는 특정한 에러코드를 발생할 것입니다. 이러한 경우에 lpNumberOfBytesSent 매개변수는 업데이트 되지 않습니다. 오버랩 연산이 완료되면, 전송된 데이터는 완료루틴(completion routine)의 cbTransferred 매개변수나, WSAGetOverlappedResult 함수의 lpcbTransfer 매개변수를 통해서 알려지게 됩니다.

WSASendTo 함수는 이전에 호출되었던 WSARecv, WSARecvFrom, WSASend 또는 WSASendTo 함수의 완료루틴 내부에서 호출되어 질 수 있습니다. 이렇게 함으로써 시간에 민감한(ex. 빨리보내야 하는데이터) 데이터의 처리가 가능하게 됩니다.

lpOverlapped 매개변수는 오버랩 연산이 진행되고 있는동안 그 값을 계속 가지고 있어야 합니다. 또한 만약 여러개의 입/출력 연산이 동시에 일어나고 있다면, 각각의 연산은 각기 구분된 WSAOVERLAPPED 구조체를 참조해야 합니다.

lpCompletionRoutine 매개변수가 NULL 이라면, lpOverlapped 매개변수의 hEvent 필드는 오버랩 연산이 완료되었을 때 신호를 받게 됩니다. 물론 이 hEvent 는 올바른 이벤트 핸들이어야 하겠죠? 어플리케이션은 이 이벤트 객체에 대해서 대기하기 위해 WSAWaitForMultipleEvents 함수를 사용하고, 필요한 데이터를 꺼집어 내기위해(poll) WSAGetOverlappedResult 함수를 사용할 수 있습니다.

lpCompletionRoutine 매개변수가 NULL이 아니라면, hEvent 필드는 무시됩니다. 그리구, 완료루틴에 흐름정보(context information)을 넘기도록 어플리케이션에서 사용할 수 있습니다. lpCompletionRoutine 매개변수가 NULL이 아닌 값을 넘기는 콜러와, 같은 오버랩 I/O에 대해서 WSAGetOverlappedResult 함수를 나중에 호출하는 것은 WSAGetOverlappedResult 함수를 TRUE를 반환하게 하기위해서 fWait 매개변수를 설정하지 않습니다. 이러한 경우에 hEvent 필드의 사용법은 정의되지 않고, hEvent 를 사용하여 대기하려고 한다면, 예기치않은 결과를 초래 할 수도 있습니다. - ( 아~~ 정말 해석 않되네요... 아래에 원문을 첨가하겠습니다. )

<원문> If lpCompletionRoutine is not NULL, the hEvent field is ignored and can be used by the application to pass context information to the completion routine. A caller that passes a non-NULL lpCompletionRoutine and later calls WSAGetOverlappedResult for the same overlapped IO request may not set the fWait parameter for that invocation of WSAGetOverlappedResult to TRUE. In this case the usage of the hEvent field is undefined, and attempting to wait on the hEvent field would produce unpredictable results.

완료루틴은 Win32 파일 I/O 완료루틴으로 규정된 것과 같은 규칙을 따릅니다. 완료루틴은 WSAWaitForMultipleEvents 함수가 fAlertable 매개변수를 TRUE하여 호출되었을 때 와 같이, 전송작업 쓰레드가 반응할 수 있는 상태가 되기 전까지 호출되지 않습니다.

전송 프로바이더는 소켓 I/O 완료 루틴의 내부에서 전송이나 수신 연산을 할 수 있도록 허용하고 있습니다. 구리구, 주어진 소켓에 대해서 완료루틴이 완료되지(nested) 않을 것이라고 보증합니다. 이렇게 함으로써 시간에 민감한(ex. 빨리보내야 하는데이터) 데이터의 처리가 가능하게 됩니다.

완료루틴의 프로토타입은 아래와 같습니다.

void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);

CompletionRoutine 함수는 어플리케이션 지정 또는 라이브러리 지정 함수 이름을 가집니다. dwError 매개변수는 lpOverlapped 매개변수에 의해서 나타낸 오버랩 연산에 대한 완료 상태를 명시합니다. cbTransferred 매개변수는 전송한 바이트의 수를 명시합니다. 일반적으로 flag 값은 정의되어 있지 않고, dwFlags 는 0을 사용합니다.

Return Values

에러가 발생하지 않고, 전송연산이 바로 완료되었다면, WSASendTo 함수는 0을 반환 합니다. 이러한 경우에 완료루틴은 호출쓰레드가 반응할 수 있는(alertable) 상태로 호출되기 위한 준비를 이미 같추었다고 볼 수 있습니다. 에러가 발생한 경우 SOCKET_ERROR 값이 반환 됩니다. 그리고, WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.
WSAENETDOWN | 네트웍 서브 시스템에 에러가 발생했습니다.
WSAEACCES | 지정된 어드레스는 브로드캐스팅 어드레스 인데, 적절한 플래그가 사용되지 않았습니다.
WSAEINTR | 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중입니다.
WSAEFAULT | lpBuffers, lpTo, lpOverlapped, lpNumberOfBytesSent, lpCompletionRoutine 매개변수가 올바른 어드레스를 넘기지 않았습니다.
WSAENETRESET | 작업이 진행되고 있는 도중에 에러상황이 검출되어서 접속이 해제 되었습니다.
WSAENOBUFS | 버퍼 사용중 데드락에 걸렸습니다.
WSAENOTCONN | 지정된 소켓이 접속된 소켓이 아닙니다.(접속지향형 소켓일 경우에만)
WSAENOTSOCK | 지정한 소켓 기술자가 소켓기술자가 아닙니다.
WSAEOPNOTSUPP | MSG_OOB 플래그가 지정되었으나, 소켓이 SOCK_STREAM 과 같은 타입의 스트림 형태의 소켓이 아닌 경우 이거나, 소켓이 out-of-band 데이터를 지원하지 않는 형태의 소켓입니다. 그리고, MSG_PARTIAL 형태가 지원되지 않거나, 소켓이 단방향 이어서 데이터 수신 연산만을 지원하는 형태입니다.
WSAESHUTDOWN | 소켓이 셧다운 되었습니다. 소켓에 대해서 shutdown 함수를 호출한 후에는 WSASend 함수를 사용할 수 없습니다.
WSAEWOULDBLOCK | 오버랩 소켓 : 너무많은 오버랩 I/O가 발생했습니다. 넌-오버랩 소켓 : 소켓이 비동기 소켓일 경우 전송 연산이 바로 완료될 수 없습니다. ( 언젠가는 완료가 될 것이므로 확실한 에러상황이라고 볼 수 없죠.)
WSAEMSGSIZE | 소켓이 메시지지향 소켓(SOCK_DGRAM)일때, 전송하려는 데이터의 크기가 지원되는 최대 크기보다 더 큽니다.
WSAEINVAL | 소켓이 bind 함수로 바인드 되지 않았거나, 소켓이 오버랩 플래그를 사용해서 생성되지 않았습니다.
WSAECONNABORTED | 가상 연결망이 타임아웃이나 그외 다른 에러상황으로 끊겨 버렸습니다.
WSAECONNRESET | 가상 연결망이 상대방에 의해서 리셋되었습니다.
WSAEADDRNOTAVAIL | 지정된 원격지 어드레스가 올바른 어드레스가 아닙니다 (ADDR_ANY 처럼)
WSAEAFNOSUPPORT | 지정된 어드레스 집합(family)이 본 소켓에서는 사용할 수 없는 형태 입니다.
WSAEDESTADDRREQ | 목적지 주소를 명시하지 않았습니다.
WSAENETUNREACH | 현재 상대방 호스트로 네트웍 접근이 도달하지 않습니다.
WSA_IO_PENDING | 오버랩 연산이 성공적으로 시작되었고, 작업이 잠시 후에 완료될 예정입니다.
WSA_OPERATION_ABORTED | 오버랩 연산이 소켓의 닫힘 때문에 취소되었거나, SO_FLUSH 컴맨드로 WSAIoctl 함수를 수행해서 연산이 도중에 취소 되었습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent, WSACreateEvent, WSAGetOverlappedResult, WSASocket, WSAWaitForMultipleEvents


WSASetBlockingHook

WSASetBlockingHook 함수는 어플리케이션 정의 블록화 함수를 설정하는 함수 입니다.

FARPROC WSASetBlockingHook (
FARPROC lpBlockingFunc
);

Parameters

lpBlockingFunc
[입력] 새로운 블록화 후크 함수에 대한 포인터

Remarks

이 함수는 윈속2 버전에서는 제거된 함수입니다.

이 함수는 WS2_32.DLL에서 바로 뽑아내서 사용할 수 없고, 윈속2 어플리케이션에서는 이 함수를 사용해선 안 됩니다. 윈속 1.1 버전 어플리케이션에서는 WINSOCK.DLL, WSOCK32.DLL을 사용하여 여전히 이 함수를 사용할 수 있습니다.

Return Values

WSASetBlockingHook 함수는 에러가 발생할 경우 이전의 블록화 후크 함수에 대한 포인터나 NULL을 반환 합니다. WSAGetLastError를 이용하여 특정한 에러코드를 얻어낼 수 있습니다.

See Also

overview , WSAIsBlocking , WSACancelBlockingCall


WSASetEvent

WSASetEvent 함수는 지정한 이벤트 객체를 신호받은 상태가 되도록 설정하는 함수입니다.

BOOL WSASetEvent(
WSAEVENT hEvent
);

Paramters

hEvent
[입력] 상태를 설정할 이벤트 객체를 식별하는 핸들

Remarks

WSASetEvent 함수는 지정한 이벤트 객체를 신호받은 상태가 되도록 설정하는 함수입니다. 이함수는 Win32 SetEvent 함수의 소켓버젼이라고 생각하시면 됩니다.

Return Values

함수가 성공적으로 수행되면, TRUE를 반환하고 실패하면, FALSE를 반환 합니다. 또한 WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSA_INVALID_HANDLE | hEvent 매개변수가 올바른 이벤트 객체 핸들이 아닙니다.

QuickInfo

Windows NT : 사용가능
 Windows : 사용가능
Windows CE : 지원하지 않음
Header :
Win32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent , WSACreateEvent , WSAResetEvent


WSAGetLastError

WSASetLastError

WSASetLastError 함수는 WSAGetLastError함수로 얻어낼 수 있는 에러코드를 설정하는 함수입니다.

void WSASetLastError (
int iError
);

Parameters

iError
[입력] 뒤이어 호출될 WSAGetLastError 함수로 반환될 에러코드를 명시한 정수값

Remarks

WSASetLastError 함수는 뒤이어 호출될 WSAGetLastError 함수로 반환될 에러코드를 설정하게됩니다. 윈도즈 소켓 함수가 호출될 때 이 함수에 의해서 설정된 에러코드는 덮어씌워지게 됩니다.

WSASetLastError 함수에 의해 설정된 에러코드는 SO_ERROR 옵션으로 호출된 getsockopt 함수의 에러코드값과는 다르다는 점을 염두해 두세요.

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, getsockopt , WSAGetLastError


WSASocket

WSASocket 함수는 트랜스포트 서비스 프로바이더에 바인드된 소켓을 생성합니다. 부수적인 기능으로, 소켓그룹에 합쳐서(join) 생성하는데 사용하기도 합니다.

SOCKET WSASocket (
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags
);

Parameters

af
[입력] 어드레스 집합(family)를 명시합니다.

type
[입력] 새로이 생성될 소켓에 대한 형태(type)을 지정합니다.

protocol
[입력] 어드레스 집합(family)으로 지정된 소켓에서 사용되는 특정한 프로토콜

lpProtocolInfo
[입력] 생성되는 소켓의 특성을 정의한 WSAPROTOCOL_INFO 구조체에 대한 포인터

g
[입력] 소켓그룹의 식별자 로써, 소켓그룹에 대해서 나중에 사용하기 위해 예약된 매개변수입니다.

dwFlags
[입력] 소켓 속성을 지정하는 플래그

Remarks

WSASocket 함수는 소켓 기술자를 얻어내고, 관련된 리소스를 할당받는 함수입니다. 기본 설정치로, 소켓은 오버랩 속성을 가지지 않습니다. 만약 lpProtocolInfo가 NULL 이라면, WS2_32.DLL은 처음 3개 매개변수(af, type, protocol)를 소켓의 특성을 정의하는데 사용하게 됩니다. 반면, lpProtocolInfo 매개변수가 NULL 이 아니라면, 소켓은 WSAPROTOCOL_INFO 구조체의 내용을 바탕으로 하여 소켓의 특성을 정의 합니다. 이러한 경우, 어플리케이션은 FROM_PROTOCOL_INFO 상수값으로 af, type, protocol 매개변수를 넘겨줄 수 있습니다. 이러한 방법은 WSAPROTOCOL_INFO 구조체로부터(iAddressFamily, iSocket, iProtocol) 부합되는 값이 사용되도록 가정되어 있음을 의미합니다.

프로토콜과 af, type, protocol 에 기반을 둔 서비스 프로바이더를 선택할 때, 이 함수의 프로시져는 프로토콜 레이어가 아닌 기본 프로토콜이나 프로토콜 체인 만을 선택 할 것입니다. 언-체인된 프로토콜 레이어는 type 이나 af 둘중하나에 기반을 둔 "partial matches"를 고려하지 않습니다. 간단히 말하자며, 적절한 프로토콜이 발견되지 않았을 때 WSAEAFNOSUPPORT 나 WSAEPROTONOSUPPORT 에러코드를 발생하지 않는 다는 말입니다.

매개변수 g는 소켓그룹에 대한 적절한 액션을 알려주기 위해 사용됩니다.
  1. g 매개변수가 존재하는 소켓 그룹 아이디 라면, 새로운 소켓은 그룹에 합쳐집니다.

  2. g 매개변수가 SG_UNCONSTRAINED_GROUP 이라면, 강요성이 없는 소켓 그룹(unconstrained socket group)을 생성하고, 새로운 소켓을 가지게 됩니다.

  3. g 매개변수가 SG_CONSTRAINED_GROUP 이라면, 강요성이 있는 소켓 그룹(constrained socket group)을 생성하고, 새로운 소켓을 가지게 됩니다.

  4. g 매개변수가 0 이라면, 그룹연산(group operation)은 아무것도 수행되지 않습니다.

강요성이 없는 그룹에서, 특정한 소켓의 집합은 단일 서비스 프로바이더에 의해서 지원되는 것처럼 함께 포함될 수 있습니다. 강요성이 있는 소켓 그룹은 접속 지향형 소켓만으로 구성될 수 있습니다. 그리고, 모든 그룹핑된 소켓들의 접속은 같은 호스트에 같은 어드레스로 접속되도록 요구됩니다. 새로 생성된 소켓 그룹에 대해서, 새로운 그룹 아이디는 SO_GROUP_ID 옵션으로 getsockopt 함수를 호출해서 얻어낼 수 있습니다. 소켓 그룹 아이디는 주어진 서비스 프로바이더에 대한 모든 프로세스에서 유일한 값입니다.

dwFlags 매개변수는 아래의 값들을 OR 연산해서 이루어진 값을 사용하여 소켓의 속성을 명시하는데 사용할 수 있습니다.

Flag | Meaning
WSA_FLAG_OVERLAPPED | 이 플래그를 사용하면, 오버랩 소켓을 생성하게 됩니다. 오버랩 소켓은 오버랩 I/O 오퍼레이션을 위하여 WSASend, WSASendTo, WSARecv, WSARecvFrom, WSAIoctl 함수를 사용할 수 있습니다. 이러한 오버랩 연산을 다루는 함수들은 오버랩과 관련된 매개변수를 NULL로 지정함으로써 넌-오버랩 소켓으로 사용 할 수도 있습니다.
WSA_FLAG_MULTIPOINT_C_ROOT | 생성된 소켓이 멀티 포인트 세션에서 c_root가 될 것이라는 것을 알려주는 플래그입니다.
WSA_FLAG_MULTIPOINT_C_LEAF | 생성된 소켓이 멀티 캐스트 세션에서 c_leaf가 될 것이라고 알려주는 플래그 입니다.
WSA_FLAG_MULTIPOINT_D_ROOT | 생성된 소켓이 멀티 포인트 세션에서 d_root 가 될 것이라고 알려주는 플래그 입니다.
WSA_FLAG_MULTIPOINT_D_LEAF | 생성된 소켓이 멀티포인트 세션에서 d_leaf가 될 것이라고 알려주는 플래그 입니다.

Return Values

에러가 발생하지 않으면, WSASocket 함수는 새로 생성된 소켓을 참조하는 기술자를 반환 합니다. 반면, 에러가 발생한 경우는, INVALID_SOCKET 이 반환 됩니다. 그리구, WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했습니다.
WSAEAFNOSUPPORT | 지정된 어드레스 체계(family)가 지원되지 않습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSAEMFILE | 사용할 수 있는 소켓기술자가 바닥 나 있어서 소켓을 생성할 수 없습니다.
WSAENOBUFS | 사용할 수 있는 버퍼가 바닥 나 있어서 소켓을 생성할 수 없습니다.
WSAEPROTONOSUPPORT | 지정된 프로토콜이 지원되지 않는 형식입니다.
WSAEPROTOTYPE | 지정된 프로토콜이 잘못되었거나 이 소켓에 대해서 잘못된 형식입니다.
WSAESOCKTNOSUPPORT | 지정된 소켓 타입이 지정한 어드레스 체계에서 지원되지 않는 형식입니다.
WSAEINVAL | 매개변수 g 가 올바른 값이 아닙니다.
WSAEFAULT | lpProtocolInfo 매개변수가 올바를 값이 아닙니다.
WSAINVALIDPROVIDER | 서비스 프로바이더가 2.2 버전과 다른 버전을 반환 했습니다.
WSAINVALIDPROCTABLE | 서비스 프로바이더가 효력이 없거나 완료할 수 없는 프로시져 테이블을 반환했습니다.

QuickInfo

Windows NT : 사용가능
 Windows : 사용가능
Windows CE : 지원하지 않음
Header :
Win32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, accept, bind , connect , getsockname , getsockopt , ioctlsocket , listen , recv , recvfrom , select , send , sendto , setsockopt , shutdown


WSAStartup

WSAStartup 함수는 WS2_32.DLL을 사용 할 수 있도록 초기화 하는데 사용하는 함수입니다.

int WSAStartup (
WORD wVersionRequested,
LPWSADATA lpWSAData
);

Parameters

wVersionRequested
[입력] 윈도즈 소켓 함수가 사용할 가장 높은 버전을 나타냅니다. 이 2Byte의 상위 바이트는 minor 버전을 의미하고, 하위 바이트는 major 버전을 의미합니다.

lpWSAData
[출력] 윈도즈 소켓 시스템 관련 정보를 반환할 WSADATA 구조체의 포인터

Remarks

WSAStartup 함수는 윈도즈 소켓 함수중에서 가장 먼저 수행되어야 할 함수입니다. 이 함수는 사용할 윈속의 버전을 명시하고, 윈도즈 소켓 시스템 관련 정보를 반환하게 됩니다. 반드시 WSAStartup 함수를 성공적으로 호출하고 나서 다른 윈도즈 소켓함수를 사용 할 수 있다는 점을 꼭 명심하세요.

윈도즈 소켓 어플리케이션이 시작할 때 어플리케이션과 윈도우즈 소켓 시스템은 특정 버전의 윈속 API를 사용하기로 협상합니다. 어플리케이션은 사용하기를 원하는 윈속 API 버전을 wVersionRequired 파라미터에 표시합니다. WSAStartup 함수가 호출될 때 윈도즈 소켓 시스템은 지원하는 가장 낮은 윈속 API버전과 요청된 윈속 API버전을 체크합니다. 요청된 버전이 시스템이 지원하는 가장 낮은 버전보다 더 높거나 같을 경우 WSAStartup 함수의 호출은 계속 진행되고, 그다음에 윈도즈 소켓 시스템은 지원하는 가장 높은 버전의 윈속 API를 WSADATA 구조체의 wHightVersion 멤버를 반환 합니다. 또한 시스템은 가장 높은 버전과 요청된 버전 중에서 낮은 버전을 WSADATA구조체의 wVersion 에 저장합니다. 이것은 어플리케이션에 적합할 경우 사용될 윈속 API버전입니다. 어플리케이션은 wVersion 멤버의 값을 이용하여 버전이 어플리케이션에 적합한지 아닌지를 결정합니다. 아래의 표는 가능한 협상 시나리오와 그 결과를 예시한 것입니다.

App versions | DLL Versions | wVersion Requested | wVersion | wHigh Version | End Result
1.1 | 1.1 | 1.1 | 1.1 | 1.1 | use 1.1
1.0 1.1 | 1.0 | 1.1 | 1.0 | 1.0 | use 1.0
1.0 | 1.0 1.1 | 1.0 | 1.0 | 1.1 | use 1.0
1.1 | 1.0 1.1 | 1.1 | 1.1 | 1.1 | use 1.1
1.1 | 1.0 | 1.1 | 1.0 | 1.0 | Application fails
1.0 | 1.1 | 1.0 | - | - | WSAVERNOT SUPPORTED
1.0 1.1 | 1.0 1.1 | 1.1 | 1.1 | 1.1 | use 1.1
1.1 2.0 | 1.1 | 2.0 | 1.1 | 1.1 | use 1.1
2.0 | 2.0 | 2.0 | 2.0 | 2.0 | use 2.0

아래의 코드는 윈도즈 소켓 버전 2.2를 사용할 때 어떻게 WSAStarup 함수를 사용하여 초기화 하는지를 보여줍니다.

WORD         wVersionRequested;
WSADATA   wsaData;
int               err;

wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
/* 요청된 윈도즈 소켓 버전(2.2) 을 사용할 수
없습니다.*/
return;
}

/*윈도즈 소켓 DLL이 버전 2.2를 지원하는지 확인
해 봅니다.*/
/*wsaData의 wVersion 필드에 사용할 수 있는 버전이 명시되죠*/
/*이
값이 사용하기 원하는 버전 2.2인지를 비교해서 판별할 수*/
/*있습니다.*/

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
/* 요청된 윈도즈 소켓 버전(2.2) 을 사용할 수
없습니다.*/
WSACleanup( );
return;
}

/* 지정된 윈도즈 소켓이 사용하도록 성공적으로 허용되었습니다. */

WSAStartup 함수를 성공적으로 호출하고 나서 필요한 다른 윈도즈 소켓 함수를 사용 할 수 있습니다. 주의 할점은 성공적인 WSAStartup 함수의 호출과 더불어 나중에 더 이상 윈도즈 소켓을 사용할 필요가 없을 때 WSACleanup함수가 쌍으로 호출되어야 한다는 점입니다. 그래야만 윈도즈 소켓 시스템에 할당되었던 리소스들을 해제 할 수 있습니다.

실제적으로 사용될 윈도즈 소켓 시스템의 세부정보는 WSADATA 구조체에 표현됩니다.

어플리케이션이 WSAData 구조체 정보를 얻고자 한다면, WSAStartup 함수를 한번이상 호출할 수 있습니다.

Return Values

성공적으로 수행한 경우 0을 반환 하고, 그렇지 않은 경우 아래의 리스트에 나열된 에러코드중의 하나를 반환 하게 됩니다.

어플리케이션은 에러코드를 얻어내기 위해서 WSAGetLastError 함수를 호출할 수 없습니다. 왜냐구요? 윈도즈 소켓 시스템이 제대로 초기화 되지 않았으니, 당연히 WSAGetLastError 함수를 사용하지 못한다는 것이죠.

Error Codes

WSASYSNOTREADY | 하부 네트웍 서브시스템이 아직 준비되지 않았습니다.
WSAVERNOTSUPPORTED | 요청한 윈도즈 소켓 버전이 현재 윈도즈 소켓 시스템에서 지원하지 않습니다.
WSAEINPROGRESS | 블로킹 윈속 1.1 이 현재 진행 중입니다.
WSAEPROCLIM | 윈속이 지원하는 최대 태스크의 수치가 한계에 도달했습니다.
WSAEFAULT | lpWSAData 매개변수가 적절한 포인터가 아닙니다.

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

overview , send , sendto, WSACleanup


WSAUnhookBlockingHook

WSAUnhookBlockingHook 함수는 디폴트 블록화 후크를 복구합니다.

int WSAUnhookBlockingHook ( void );

Remark

WSAUnhookBlockingHook 함수는 항상 디폴트 블록화 후크를 복구합니다. WSASetBlockingHook 함수에 의해 반환된 이전의 블록화 후크를 복구하고 싶을 경우 어플리케이션은 이전의 함수 포인터를 파라미터로 사용하여 WSASetBlockingHook 함수를 다시 호출할 수 있습니다.

이 함수는 윈속2 버전에서는 제거된 함수입니다. 그러므로, WS2_32.DLL에서 바로 뽑아내서 사용할 수 없고, 윈속2 어플리케이션에서는 이 함수를 사용해선 안 됩니다. 윈속 1.1 버전 어플리케이션에서는 WINSOCK.DLL, WSOCK32.DLL을 사용하여 여전히 이 함수를 사용할 수 있습니다.

See Also

overview , WSAIsBlocking , WSACancelBlockingCall


WSAWaitForMultipleEvents

WSAWaitForMultipleEvents 함수는 지정된 이벤트 객체의 한 개 또는 모두가 신호받은 상태였을 때나, 타임아웃 간격으로 지정한 시간이 지났을 때까지 기다렸다 반환되는 함수입니다.

DWORD WSAWaitForMultipleEvents(
DWORD cEvents,
const WSAEVENT FAR* lphEvents,
BOOL fWaitAll,
DWORD dwTimeOUT,
BOOL fAlertable
);

Parameters

cEvents
[입력] lphEvent 매개변수로 포인트되는 배열에 있는 이벤트 객체 핸들의 갯수를 명시합니다. 이벤트 객체 핸들의 최대 갯수는 WSA_MAXIMUM_WAIT_EVENTS입니다. 한 개 또는 그 이상의 이벤트는 반드시 명시되어야 합니다.

lphEvents
[입력] 이벤트 객체 핸들의 배열에 대한 포인터

fWaitAll
[입력] 기다림의 형태를 명시하는 매개변수로, 이값이 TRUE 라면, 이 함수는 lphEvent 배열에 있는 모든 이벤트 객체가 같은 시간에 신호를 받을 때 반환됩니다. 반면, FALSE 라면, 이벤트 객체중에 하나가 신호를 받을 때 반환 됩니다. 후자의 경우, 함수의 반환값은 이벤트 객체(함수의 반환으로 일어난 상태)를 의미합니다.

dwTimeout
[입력] 타임아웃 간격을 명시하는 매개변수로 m/sec 단위(1/1000초)입니다. 지정된 시간이 다 지나게 되면, fWaitAll 매개변수에 의해 지정된 상태(이벤트 객체가 신호를 받아야 하는 조건)가 만족되지 않더라도 함수는 반환되게 됩니다.

fAlertable
[입력] 시스템이 함수를 호출하는 쓰레드의 실행에 대한 I/O 완료루틴(completion routine)을 큐(queue) 시켰을 때 함수가 반환될지 어떤지를 명시하는 매개변수로, 이값이 TRUE 일 경우 완료루틴은 실행되고, 함수는 반환됩니다. FALSE 라면, 완료루틴은 함수가 반환될 때 실행되지 않습니다.

Remarks

WSAWaitForMultipleEvents 함수는 명시된 객체들 중 한 개 또는 모두가 신호받은 상태(signaled state)가 되었을 때나, 타임아웃 간격으로 지정한 시간을 모두 소비했을 때 호출 되는 함수입니다. 이 함수는 또한 fAlertable 매개변수를 TRUE 로 설정하여 알람대기(alertable wait) 기능을 수행 하는데 사용합니다. 이러한 기능은 시스템이 호출 쓰레드에서 수행되는 완료루틴(completion routine)을 큐(queue) 했을 때 함수가 반환 되도록 하는데 사용될 수 있습니다.

fWaitAll 매개변수가 TRUE라면, 함수의 대기상태(wait condition)은 같은시기에 모든 객체의 상태가 신호를 받았을 때만, 만족됩니다. 이 함수는 모든 객체가 동시에 신호받을 때 까지 명시된 객체의 상태를 갱신하지 않습니다.

신호받는 이벤트 객체가 필요없는 간단한 알람 대기 상태를 구현하고자 하고자 한다면, Win32 API인 SleepEx 함수를 사용하면 됩니다.

Return Values

함수가 성공적으로 수행된다면, 반환값은 아래의 표에 나열한 값중 하나를 가지게 됩니다. 함수가 실패한다면, 함수는 WSA_WAIT_FAILED를 반환합니다. 또한 WSAGetLastError 함수를 호출하여 특정한 에러코드를 얻어낼 수 있습니다.

함수를 성공적으로 수행하고 반환되는 값을 아래에 나열 해 보았습니다.

Value | Meaning
WSA_WAIT_EVENT_0 부터 (WSA_WAIT_EVENT_0 + cEvents - 1) 의 수치를 가질 경우 | fWaitAll 매개변수가 TRUE라면, 반환값은 모든 명시된 이벤트 객체가 신호받았다는 것을 나타냅니다. fWaitAll 이 FALSE 라면, 반환값은 대기 상태가 완료된 이벤트 객체 배열의 인덱스를 가리킵니다.
WAIT_IO_COMPLETION | 한 개 또는 그 이상의 I/O 완료루틴(completion routine)이 수행을 위하여 큐(queue) 되었습니다.
WSA_WAIT_TIMEOUT | fWaitAll 매개변수로 지정된 조건이 만족되지 않은 상태에서 타임아웃으로 대기상태가 종료 되었습니다.

Error Codes

WSANOTINITIALISED | 이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.
WSAENETDOWN | 네트웍 서브시스템에 에러가 발생했습니다.
WSAEINPROGRESS | 블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.
WSA_NOT_ENOUGH_MEMORY | 메모리가 부족합니다.
WSA_INVALID_HANDLE | 한 개 또는 그 이상의 lphEvents 배열요소가 올바른 이벤트 객체 핸들이 아닙니다.
WSA_INVALID_PARAMETER | cEvent 매개변수가 올바른 핸들의 갯수를 가지고 있지 않습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원하지 않습니다.
Header :
Win16/32 : winsock.h
Win32-II : winsock2.h
Import Library :
Win16 : winsock.lib
Win32 : wsock32.lib
Win32-II : ws2_32.lib

See Also

overview, WSACloseEvent, WSACreateEvent