소켓 API는 TCP / IP 및 UDP / IP 통신에 대한 사실상의 표준입니다 (즉, 우리가 알고있는 네트워킹 코드). 그러나 핵심 기능 중 하나 accept()
는 약간 마술 적입니다.
반 공식적인 정의를 빌리려면 :
accept ()는 서버 측에서 사용됩니다. 원격 클라이언트에서 새 TCP 연결을 만들기 위해 수신 된 수신 시도를 수락하고이 연결의 소켓 주소 쌍과 관련된 새 소켓을 만듭니다.
즉, accept
서버가 새로 연결된 클라이언트와 통신 할 수있는 새 소켓을 반환합니다. 이전 소켓 ( accept
호출 된)은 동일한 포트에서 열린 상태로 유지되어 새 연결을 수신합니다.
어떻게 accept
작동합니까? 어떻게 구현됩니까? 이 주제에 대해 많은 혼란이 있습니다. 많은 사람들이 accept가 새 포트를 열고이를 통해 클라이언트와 통신한다고 주장합니다. 그러나 새 포트가 열리지 않기 때문에 이것은 분명히 사실이 아닙니다. 실제로 다른 클라이언트와 동일한 포트를 통해 통신 할 수 있지만 어떻게해야합니까? 여러 스레드 recv
가 동일한 포트에서 호출 할 때 데이터가 어디로 가야하는지 어떻게 알 수 있습니까?
소켓 설명자와 연결되는 클라이언트 주소의 줄을 따라가는 것 같고 데이터가 올 때마다 recv
올바른 소켓으로 라우팅되지만 확실하지 않습니다.
이 메커니즘의 내부 작동에 대한 철저한 설명을 얻는 것이 좋습니다.