반응형

getpeername(2)

#include <sys/socket.h>

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

connect(2)나 accept(2)된 socket descriptor에서 연결된 상대 시스템의 address(주소)를 얻습니다.
이 함수를 통해서 접속한 상대 시스템의 address를 logging하거나 접속 차단 대상이면 sockfd를 close( )하는 등의 작업을 할 수 있습니다. accept(2)시에도 얻을 수도 있습니다. 두번째 파라미터인 strct sockaddr 구조체는 Address Family (AF_*)에 따라서 다른 구조체를 갖습니다. (참조: struct sockaddr - Address Family에 따른 구조체)

 

 

파라미터

sockfd
    - connect(2) 또는 accept(2)를 통하여 연결된 socket descriptor.
addr
    - 상대 시스템의 주소를 저장할 buffer.
    - 정상적으로 실행되면 상대 시스템의 주소값이 채워집니다. (OUTPUT용)
    - 구조체 종류는 Address Family의 종류에 따라 다른 구조체를 parameter로 전달해야 합니다.
addrlen
    - addr의 buffer 크기를 설정하고 함수를 호출해야 합니다. (INPUT)
    - getpeername( ) 호출이 끝나면 실제로 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에서의 상대시스템 address 얻기

#include <sys/socket.h>

......

int       connected_fd;
struct    sockaddr_in remote_addr;
socklen_t addr_len   = sizeof(struct sockaddr_in);
char      remote_ip_addr[16];

......

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

strncpy(remote_ip_addr, inet_ntoa(remote_addr.sin_addr.s_addr), 16);
printf("접속된 상대방의 IP address는 %s입니다.\n", remote_ip_addr);

.....
.

 


see also : Socket 통신과 Socket 응용

 

 

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,