개발자 Q&A

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

2025.07.02 23:40

EventHttp::accept와 TCP 연결의 이해

목록
  • Scala마법사 18일 전 2025.07.02 23:40 인기
  • 483
    1
제가 EventHttp::accept 함수를 사용하여 TCP 연결을.accept 하는데,

accept 함수의 반환값은 소켓 디스크립터를 반환한다고 합니다.

하지만, 이 반환값은 실제로 소켓 디스크립터가 맞는지,

혹은 연결된 클라이언트의 소켓 디스크립터를 가리키는 건지 잘 모르겠습니다.

또한, TCP 연결의 3-way handshake 과정을 통해

클라이언트와 서버가 연결이 되었을 때,

accept 함수를 호출하여 연결을 수락하는 방식에 대해

더 자세한 정보를 얻고 싶습니다.

이에 대한 답변과 함께, 예시 코드를 제공해주시면 감사하겠습니다.

    댓글목록

    profile_image
    나우호스팅  18일 전



    EventHttp::accept 함수는 TCP 연결을 수락하는 함수로, 이 함수의 반환값은 실제로 소켓 디스크립터가 맞습니다. 소켓 디스크립터는 클라이언트와 서버 간의 통신을 위한 고유한 식별자로, 연결된 클라이언트의 소켓 디스크립터를 가리키는 것이 아닙니다.

    TCP 연결의 3-way handshake 과정은 다음과 같습니다.

    1. 클라이언트가 서버에 연결 요청을 보내고, SYN (Synchronize) 패킷을 보냅니다.
    2. 서버가 클라이언트의 연결 요청을 수락하고, SYN-ACK (Synchronize-Acknowledgment) 패킷을 보냅니다.
    3. 클라이언트가 서버의 SYN-ACK 패킷을 받고, ACK (Acknowledgment) 패킷을 보냅니다.

    이러한 3-way handshake 과정 이후, 서버가 accept 함수를 호출하여 연결을 수락합니다. accept 함수는 클라이언트와 서버 간의 통신을 위한 소켓 디스크립터를 반환합니다.

    예시 코드는 다음과 같습니다.

    #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) {
    
            // 클라이언트 연결.accept
    
            client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
    
            if (client_fd < 0) {
    
                perror("accept");
    
                continue;
    
            }
    
    
    
            printf("클라이언트가 연결되었습니다.n");
    
    
    
            // 클라이언트와 통신
    
            char buffer[1024];
    
            recv(client_fd, buffer, 1024, 0);
    
            printf("클라이언트가 보낸 메시지: %sn", buffer);
    
    
    
            // 클라이언트에 메시지 보내기
    
            char *message = "서버에서 보낸 메시지입니다.";
    
            send(client_fd, message, strlen(message), 0);
    
    
    
            // 클라이언트 연결 종료
    
            close(client_fd);
    
        }
    
    
    
        return 0;
    
    }
    
    


    이 코드는 서버 소켓을 생성하고, 클라이언트 연결을 수락하여 클라이언트와 통신하는 예시입니다. accept 함수의 반환값은 클라이언트와 서버 간의 통신을 위한 소켓 디스크립터를 반환합니다.

    2025-07-02 23:41

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

검색

게시물 검색