Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

4. 소켓 네트워크 프로그램 개발 - 5. 연결 대기(accept 함수) 본문

TCP IP 소켓 프로그래밍

4. 소켓 네트워크 프로그램 개발 - 5. 연결 대기(accept 함수)

scarecrow1992 2021. 5. 10. 23:23

  • 수신 대기열의 가장 앞에 있는 연결 요청을 가져온다.
  • 연결 요청을 성공적으로 가져오면 클라이언트와의 통신을 위한 연결 소켓을 생성한다.

 

accept 함수의 원형은 아래와 같다

1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
cs

매개변수

  • sockfd : socket 함수 호출시 반환된 소켓 식별 번호
  • addr : accept 함수 성공시, 연결된 client의 주소와 포트 정보가 담기는 구조체
  • addrlen : sockaddr 구조체의 크기
  • 반환값
    • 0 이상 : 성공, 소켓 지정 번호
    • -1 : 실패

함수자체의 컨셉은 bind 함수와 유사하다.

반환값은 socket 함수로 만든 듣기 소켓과는 전혀 다른 별개의 소켓이다.

듣기 소켓 : 연결 요청을 확인하는(듣는) 일만 수행, 연결 요청을 받으면 즉시 수신 대기열로 넘겨 다음 요청을 기다린다.

연결 소켓 : 실제 client 와의 통신

요청을 받아 들이는 과정과 통신하는 과정이 분리된다.

듣기 소켓과 연결소켓의 구분을 통해, 통신하는 중에도 다른 클라이언트의 연결 요청을 받아들일 수 있다.

그리고 이를 구현하기 위해 주로 멀티 프로세스나 멀티 스레딩 프로그래밍이 쓰인다.

 

기본적인 사용법은 아래와 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct sockaddr_in, client_sockaddr;
int client_sockfd;
int client_addr_size;
 
while(1){
    client_addr_size = sizeof(client_addr);
    client_sockfd = accept(sockfd,
        (struct sockaddr *&client_sockaddr,
        &client_addr_size
    );
 
    if (client_sockfd == -1) {
        // 에러 처리
    }
    else {
        // client_sockfd를 이용해서 통신을 한다.
    }
}
cs

 

 

Comments