
socket_getpeername 함수는 소켓의 연결된 상대방의 주소 정보를 가져올 수 있는 함수입니다.
이 함수를 사용하려면, 소켓의 파일 디스크립터를 전달해야 합니다. 소켓의 연결된 상대방의 주소 정보는 struct sockaddr 형식으로 반환됩니다.
이 함수는 TCP, UDP 소켓 모두 사용할 수 있습니다.
socket_getpeername 함수를 사용하는 예를 살펴보겠습니다.
#hostingforum.kr
c
#include
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// ...
struct sockaddr_in peer_addr;
socklen_t peer_len = sizeof(peer_addr);
// getpeername 함수를 사용하여 소켓의 연결된 상대방의 주소 정보를 가져옵니다.
getpeername(sockfd, (struct sockaddr *)&peer_addr, &peer_len);
// ...
return 0;
}
이 코드에서 getpeername 함수는 sockfd 파일 디스크립터를 전달받아, 연결된 상대방의 주소 정보를 struct sockaddr_in 형식으로 반환합니다.
socket_getpeername 함수를 사용할 때, 에러가 발생할 수 있는 상황은 다음과 같습니다.
- 소켓이 연결되지 않은 경우
- 소켓의 파일 디스크립터가 유효하지 않은 경우
- struct sockaddr 형식이 유효하지 않은 경우
에러가 발생한 경우, 다음과 같이 해결할 수 있습니다.
- 소켓이 연결되지 않은 경우: 연결을 먼저 수행해야 합니다.
- 소켓의 파일 디스크립터가 유효하지 않은 경우: 유효한 파일 디스크립터를 전달해야 합니다.
- struct sockaddr 형식이 유효하지 않은 경우: 유효한 struct sockaddr 형식을 전달해야 합니다.
예를 들어, 다음과 같이 에러를 처리할 수 있습니다.
#hostingforum.kr
c
#include
#include
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// ...
struct sockaddr_in peer_addr;
socklen_t peer_len = sizeof(peer_addr);
if (getpeername(sockfd, (struct sockaddr *)&peer_addr, &peer_len) == -1) {
// 에러 처리
if (errno == ENOTCONN) {
// 소켓이 연결되지 않은 경우
printf("소켓이 연결되지 않았습니다.n");
} else if (errno == EBADF) {
// 소켓의 파일 디스크립터가 유효하지 않은 경우
printf("유효하지 않은 파일 디스크립터입니다.n");
} else if (errno == EINVAL) {
// struct sockaddr 형식이 유효하지 않은 경우
printf("유효하지 않은 struct sockaddr 형식입니다.n");
} else {
// 기타 에러
printf("기타 에러: %sn", strerror(errno));
}
} else {
// 성공
printf("성공적으로 연결된 상대방의 주소 정보를 가져왔습니다.n");
}
return 0;
}
2025-06-01 12:28