서버에서 소켓을 만들고 포트에 바인딩하고 루프를 통해 연결을 허용하는 스레드를 시작했습니다. 언젠가 나중에 스레드 종료를 초래하는 예외로 인해 루프가 종료되었지만 소켓은 여전히 포트에 묶여 있습니다. 이제 클라이언트가이 서버에 '연결'을하면 성공합니다. 그게 어떻게 가능해? 올바르게 이해하면 서버가 청취 소켓에서 '수락'한 후에 만 '연결'이 반환됩니다. 내가 여기서 뭔가를 놓치고 있니?'accept'를 호출하는 서버없이 소켓에서 호출을 성공적으로 반환 할 수 있습니까?
9
A
답변
17
올바르게 이해하면 서버가 청취 소켓에서 '수락'한 후에 만 '연결'이 반환됩니다. 내가 여기서 뭔가를 놓치고 있니?
예. TCP는 덮개 아래에 연결 (3 방향 핸드 셰이크)을 설정하고 준비된 연결 대기열에 넣습니다. Accept()는이 대기열의 앞에서 다음으로 대기중인 연결을 반환합니다.
클라이언트의 관점에서 보았을 때 서버는 "연결"되지만 서버가 처리하고 처리하기 전에는 다른 사람과 대화하지 않습니다. 회사에 전화를 걸고 즉시 보류 대기열에 배치 될 때와 비슷합니다. 당신은 "연결되어"있지만 어떤 사람이 실제로 집어 들고 이야기하기 전까지는 아무런 일도 일어나지 않을 것입니다.
개별 스레드가 죽었을 수도 있지만 프로세스가 아직 살아 있고 파일 설명자가 열려있어 TCP가 응용 프로그램 수준에서 무슨 일이 일어나고 있는지 알지 못합니다.
4
연결된 소켓은 수신 프로세스가 accept()를 기다리는 대기열로 이동합니다. 제한된 백 로그가 있으며 일단 도달하면 OS는 연결을 거부하거나 무시합니다.
관련 문제
- 1. 연결된 소켓에서 read() 함수가 0 바이트를 반환 할 수 있습니까?
- 2. 소켓에서 BeginAccept를 호출하는 경우
- 3. 소켓에서 비표 시할 수 있습니까?
- 4. ssl. bsd 소켓에서 ssl을 추가/제거 할 수 있습니까?
- 5. 어떻게 동기식 rpc 호출을 할 수 있습니까?
- 6. Indy 연결 호출을 방해 할 수 있습니까?
- 7. Android : 시스템 호출을 관찰 할 수 있습니까?
- 8. iOS에서 시스템 호출을 할 수 있습니까?
- 9. 모듈에서 시스템 호출을 추가 할 수 있습니까?
- 10. 기계화로 Javascript 호출을 할 수 있습니까?
- 11. ASP.NET에서 콘텐츠 호출을 리디렉션 할 수 있습니까?
- 12. 웹 서버없이 PHP를 어떻게 실행할 수 있습니까?
- 13. Perl이 호출자에게 어떻게 반환 할 수 있습니까?
- 14. 반환 할 때 함수를 호출하는 방법
- 15. Silverlight 클라이언트에서 wcf 호출을 집계 할 수 있습니까?
- 16. 어떻게 성공적으로 그래픽을 Java로 확장 할 수 있습니까?
- 17. 스레드에서 원격 SOAP 호출을 호출하는 예외
- 18. WCF를 사용하여 AJAX 호출을 용이하게 할 수 있습니까?
- 19. 콜백 호출을 IEnumerable로 변환 할 수 있습니다.
- 20. Perl의 여러 소켓에서 어떻게들을 수 있습니까?
- 21. 액체 템플리트에서 AJAX 호출을 수행 할 수 있습니까?
- 22. LotusScript 함수에서 목록을 반환 할 수 있습니까?
- 23. void 함수로 반환 할 수 있습니까?
- 24. actionPerformed가 값을 반환 할 수 있습니까?
- 25. 절약 목록에서지도 목록을 반환 할 수 있습니까?
- 26. 메서드에서 StreamReader를 반환 할 수 있습니까?
- 27. C# 메서드가 메서드를 반환 할 수 있습니까?
- 28. ImageMagick에서 이미지 크기를 반환 할 수 있습니까?
- 29. 클래스가 자체 객체를 반환 할 수 있습니까?
- 30. cocos2d Director가 시간을 반환 할 수 있습니까?
전화 서비스 보류 대기열과 아직 accept()되지 않은 TCP 연결 간의 차이점 : TCP 연결을 통해 전송되는 바이트는 운영 체제에 의해 버퍼링되며 accept() 호출이 발생하면 수신됩니다. 만들어졌습니다. 전화 시스템 보류 회선에서 발신자가 말한 것은 모두 삭제됩니다. –
나는 그것을 감사 할 것인지에 대해 논쟁을 벌였습니다. 물론 전화 서비스가 보류 상태에 있다고 생각하는 동안 당신을 녹음하지 않고 muzak을 파이핑하고 있다고 말할 것도 없습니다. :) – Duck
이것은 'listen()'호출에 대한'backlog' 매개 변수가 모두 무엇인지를 지적하는 가치가 있습니다 - 백 로그는 연결되어 있지만 수락되지 않은 상태에있을 수있는 연결 수입니다. 언제든지. – caf