반응형

getsockname(2)

#include <sys/socket.h>

int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

socket descriptor할당된 자신의 address(주소)를 얻습니다. 두번째 파라미터인 struct sockaddr 구조체는 socket 생성 시에 설정한 Address Family (AF_* 상수)의 값에 따라서 구조체의 구조가 다르므로 Address Family에 맞는 구조체를 선언하여 사용해야 합니다. (참고: struct sockaddr - Address Family에 따른 구조체 )

 

 

파라미터

sockfd
    -  정상적으로 생성된 socket descriptor. 주로 connect(2), accept(2), bind(2)된 socket descriptor.
sockaddr
    - 자신의 주소를 저장할 buffer.
    - 정상적으로 실행되면, sockfd에 설정된 자신의 address주소값이 채워집니다. (OUTPUT용)
    - socket에 자신의 주소는 client socket에서는 bind(2)를 하지 않는 이상은 connect(2)시에 자동으로 할당되며,
      server socket도 자신의 주소는 port번호만 설정하는 것이 일반적이라 accept(2)시에 할당됩니다.
      따라서 대부분은 connect(2), accept(2) 후의 socket descriptor에 사용합니다.

      구조체 종류는 Address Family (AF_* 상수)의 종류에 따라 다른 구조체를 parameter로 전달해야 합니다.
addrlen
    - 두번째 파라미터인 addr 구조체의 크기를 설정하고 함수를 호출해야 합니다. (INPUT)
    - getsockname( ) 호출이 끝나면 실제로 addr에 채워진 사이즈가 저장됩니다. (OUTPUT)

 

RETURN

0 
    - 정상적으로 자신의 주소 정보가 얻었습니다.

-1
    - 오류가 발생하였으며, 상세 오류정보는 errno 전역변수에 저장되었습니다.

 EBADF    : sockfd가 유효하지 않은 descriptor입니다.
 EFAULT   : addr 변수가 유효한 메모리 영역이 아닙니다.
 EINVAL   : addrlen 변수가 유효한 메모리 영역이 아닙니다.
 ENOBUFS  : 시스템에서 처리를 위한 resource 부족합니다.
 ENOTCONN : socket이 연결된 상태가 아닙니다. (connect()를 호출하지 않았거나 accept()되지않은 socket입니다.
 ENOTSOCK : sockfd가 socket이 아닙니다.

 


활용 예제

 

Sample. TCP/IP에서의 socket의 자신의 address 얻기

#include <sys/socket.h>

......

int       connected_fd;
struct    sockaddr_in my_addr;
socklen_t addr_len   = sizeof(struct sockaddr_in);
char      my_ip_addr[16];

......

if(getsockname(connected_fd, &my_addr, &addr_len) == -1) {
    fprintf(stderr, "getsockname() 호출 error : %s\n", strerror(errno));
    return -1;   
}

strncpy(my_ip_addr, inet_ntoa(my_addr.sin_addr.s_addr), 16);
printf("나의 IP address는 %s입니다.\n", my_ip_addr);

......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,