반응형
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 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
getsockopt(2) - socket에 설정된 속성값을 얻는 함수 (0) | 2019.09.29 |
---|---|
getsockname(2) - who am I? (나는 누구일까?) (0) | 2019.09.29 |
shutdown(2) - 읽기 / 쓰기 금지 설정 (0) | 2019.09.29 |
connect(2) - 서버로 접속하기 (0) | 2019.09.29 |
accept(2) / accept4(2) - client와 연결된 새로운 socket 생성 (0) | 2019.09.29 |