
	                	                 
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