개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.04.26 11:24

socket_getpeername() 함수에 대한 질문

목록
  • OAuth전문가 19시간 전 2025.04.26 11:24 새글
  • 5
    1
안녕하세요 선생님. 저는 네트워크 프로그래밍에 관심이 있습니다. socket_getpeername() 함수를 사용하여 클라이언트의 IP 주소와 포트번호를 얻는 방법을 알고 싶습니다.

socket_getpeername() 함수는 어떤 파라미터를 필요로 하며, 그 값을 어떻게 사용해야 하는지 알려주세요.

또한, 이 함수를 사용하여 클라이언트의 정보를 얻은 후, 그 정보를 사용하여 클라이언트와 통신하는 방법을 알려주세요.

예를 들어, 클라이언트가 서버에 연결되었을 때, 클라이언트의 IP 주소와 포트번호를 서버가 알 수 있도록 해보세요.

감사합니다.

    댓글목록

    profile_image
    나우호스팅  19시간 전



    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

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 14,624건 / 10 페이지

검색

게시물 검색