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

overviewconnectgetsocknamelistensetsockoptsocketWSACancelBlockingCall

 

 

출처 : DEVPIA 곽용진님 style  APIs

[출처] [Socket] bind|작성자 임종배

+ Recent posts