
socket_getpeername() 함수는 소켓의 연결된 클라이언트의 IP 주소와 포트번호를 얻기 위해 사용됩니다. 이 함수의 파라미터는 다음과 같습니다.
- 소켓 파일 디스크립터 (소켓 ID)
- 클라이언트의 IP 주소와 포트번호를 저장할 구조체 (sockaddr)
- 구조체의 크기
이 함수를 사용하여 클라이언트의 정보를 얻은 후, 그 정보를 사용하여 클라이언트와 통신하는 방법은 다음과 같습니다.
1. 클라이언트가 서버에 연결되었을 때, 서버는 클라이언트의 IP 주소와 포트번호를 얻기 위해 socket_getpeername() 함수를 호출합니다.
2. 클라이언트의 IP 주소와 포트번호를 저장할 구조체 (sockaddr)를 선언하고 초기화합니다.
3. socket_getpeername() 함수를 호출하여 클라이언트의 IP 주소와 포트번호를 얻습니다.
4. 얻은 클라이언트의 정보를 사용하여 클라이언트와 통신합니다.
예를 들어, 클라이언트가 서버에 연결되었을 때, 클라이언트의 IP 주소와 포트번호를 서버가 알 수 있도록 해보겠습니다.
#hostingforum.kr
c
#include
#include
#include
#include
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
// 서버 소켓 생성
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("socket");
return -1;
}
// 서버 주소 설정
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
// 서버 소켓 바인딩
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
return -1;
}
// 서버 소켓 리스닝
if (listen(server_fd, 3) < 0) {
perror("listen");
return -1;
}
printf("서버가 시작되었습니다.n");
// 클라이언트 연결 대기
while (1) {
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
perror("accept");
continue;
}
// 클라이언트의 IP 주소와 포트번호 얻기
struct sockaddr_in client_addr_copy;
socklen_t client_len_copy = sizeof(client_addr_copy);
getpeername(client_fd, (struct sockaddr *)&client_addr_copy, &client_len_copy);
// 클라이언트의 IP 주소와 포트번호 출력
printf("클라이언트의 IP 주소: %s:%dn", inet_ntoa(client_addr_copy.sin_addr), ntohs(client_addr_copy.sin_port));
// 클라이언트와 통신
char buffer[256];
while (1) {
int bytes_received = recv(client_fd, buffer, 256, 0);
if (bytes_received < 0) {
perror("recv");
break;
}
buffer[bytes_received] = ' ';
printf("클라이언트가 보낸 메시지: %sn", buffer);
char* message = "서버가 클라이언트에게 보낸 메시지입니다.";
send(client_fd, message, strlen(message), 0);
}
close(client_fd);
}
close(server_fd);
return 0;
}
이 예제에서는 서버가 클라이언트의 IP 주소와 포트번호를 얻기 위해 getpeername() 함수를 호출하고, 클라이언트와 통신합니다.
2025-04-26 11:25