2010-03-09 2 views
9

서버에서 소켓을 만들고 포트에 바인딩하고 루프를 통해 연결을 허용하는 스레드를 시작했습니다. 언젠가 나중에 스레드 종료를 초래하는 예외로 인해 루프가 종료되었지만 소켓은 여전히 ​​포트에 묶여 있습니다. 이제 클라이언트가이 서버에 '연결'을하면 성공합니다. 그게 어떻게 가능해? 올바르게 이해하면 서버가 청취 소켓에서 '수락'한 후에 만 ​​'연결'이 반환됩니다. 내가 여기서 뭔가를 놓치고 있니?'accept'를 호출하는 서버없이 소켓에서 호출을 성공적으로 반환 할 수 있습니까?

답변

17

올바르게 이해하면 서버가 청취 소켓에서 '수락'한 후에 만 ​​'연결'이 반환됩니다. 내가 여기서 뭔가를 놓치고 있니?

예. TCP는 덮개 아래에 연결 (3 방향 핸드 셰이크)을 설정하고 준비된 연결 대기열에 넣습니다. Accept()는이 대기열의 앞에서 다음으로 대기중인 연결을 반환합니다.

클라이언트의 관점에서 보았을 때 서버는 "연결"되지만 서버가 처리하고 처리하기 전에는 다른 사람과 대화하지 않습니다. 회사에 전화를 걸고 즉시 보류 대기열에 배치 될 때와 비슷합니다. 당신은 "연결되어"있지만 어떤 사람이 실제로 집어 들고 이야기하기 전까지는 아무런 일도 일어나지 않을 것입니다.

개별 스레드가 죽었을 수도 있지만 프로세스가 아직 살아 있고 파일 설명자가 열려있어 TCP가 응용 프로그램 수준에서 무슨 일이 일어나고 있는지 알지 못합니다.

+3

전화 서비스 보류 대기열과 아직 accept()되지 않은 TCP 연결 간의 차이점 : TCP 연결을 통해 전송되는 바이트는 운영 체제에 의해 버퍼링되며 accept() 호출이 발생하면 수신됩니다. 만들어졌습니다. 전화 시스템 보류 회선에서 발신자가 말한 것은 모두 삭제됩니다. –

+0

나는 그것을 감사 할 것인지에 대해 논쟁을 벌였습니다. 물론 전화 서비스가 보류 상태에 있다고 생각하는 동안 당신을 녹음하지 않고 muzak을 파이핑하고 있다고 말할 것도 없습니다. :) – Duck

+2

이것은 'listen()'호출에 대한'backlog' 매개 변수가 모두 무엇인지를 지적하는 가치가 있습니다 - 백 로그는 연결되어 있지만 수락되지 않은 상태에있을 수있는 연결 수입니다. 언제든지. – caf

4

연결된 소켓은 수신 프로세스가 accept()를 기다리는 대기열로 이동합니다. 제한된 백 로그가 있으며 일단 도달하면 OS는 연결을 거부하거나 무시합니다.

+0

제 질문은 "연결"호출이 반환 될 때입니다. 서버가 연결 소켓에서 "수락"을하거나 성공적으로 수신 대기열로 이동할 때? 서버가 "accept"를 호출하지 않으면 클라이언트에서 "connect"가 성공할 것으로 기대할 수 있습니까? – kumar

+2

올바르지 않습니다. 연결은 서버가 accept()를 호출하기를 기다리지 않습니다. 일반적으로 요청을 대기시키는 OS의 응답을 기다립니다. – MarkR

관련 문제