더북(TheBook)

accept()가 성공하면 내부적으로 새 소켓이 만들어져 리턴되며 이 소켓은 이후 그 원격 호스트와 통신하는 용도로 쓸 수 있다. 새 소켓은 리스닝 소켓과 같은 포트에 바인딩된다. 한 포트에 여러 소켓이 바인딩되는 셈인데, 운영체제가 그 포트를 목적지로 하는 패킷을 받으면 그 발신자 주소와 포트를 보고 어느 소켓으로 보낼지 결정한다. TCP는 연결된 각 원격 호스트마다 소켓을 하나씩 가지고 있어야 한다는 사실을 기억해 두자.

accept()가 리턴한 새 소켓은 연결이 수립된 원격 호스트에 대응된다. 여기에 원격 호스트의 주소와 포트가 기록되어 있고, 이 호스트로 보내는 패킷 전부가 저장되어 있어 나중에 누락이 발생한 경우 재전송 용도로 사용된다. 해당 원격 호스트와 통신하려면 오로지 이 소켓을 이용해야 한다. 절대로 리스닝 모드에 들어간 원래 소켓을 데이터를 보내는 수단으로 사용해서는 안 된다. 어차피 보내지지도 않는데, 리스닝 소켓이 실제로 연결된 곳은 어디에도 없기 때문이다. 리스닝 소켓은 새로 들어오는 연결 요청을 마중하여 이를 전담해 줄 새로운 소켓을 만들어 주는 역할만 할 뿐이다.

디폴트로 accept()가 아직 받아줄 연결이 없는 상태라면, 호출 스레드를 블로킹 걸어 새 연결이 들어오거나 시간이 초과될 때까지 기다린다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.