source

소켓 프로그래밍 - listen()과 accept()의 차이점은 무엇입니까?

ittop 2023. 7. 1. 09:59
반응형

소켓 프로그래밍 - listen()과 accept()의 차이점은 무엇입니까?

소켓 프로그래밍에 대해 배우기 위해 튜토리얼을 읽고 있습니다.보아하니..listen()그리고.accept()은 둘 다합니다. 즉, 으로 될 때까지 것입니다. 차단하고 클라이언트가 소켓에 연결될 때까지 기다립니다.socket()을 위해한 이유는 무엇입니까?이를 위해 두 단계가 필요한 이유는 무엇입니까?시스템 호출을 한 번만 사용하는 것이 어떻습니까?

그런데, 저는 이 질문에 대해 구글 검색을 해보고 비슷한 질문을 찾았지만, 만족스러운 답은 하나도 없었습니다.예를 들어, 그들 중 한 명이 말했습니다.accept()소켓이 생성된다는 것을 알고 있기 때문에, 말도 안 되는 것은 소켓이 생성된다는 것을 알고 있기 때문입니다.socket().

listen()으로 내부 하는데, 이를 패시브 리스닝 소켓이라고 수 .accept소켓이 클라이언트로부터 연결을 수신하기 시작할 수 있도록 바인딩된 포트를 엽니다.

accept()함수는 수신 소켓에 다음 수신 연결을 수락하고 해당 연결에 대한 소켓 설명자를 반환하도록 요청합니다.그래서, 어떤 의미에서,accept() 소켓을 생성합니다. 사용하는 소켓이 아닙니다.listen()의 수신 연결에 사용됩니다.

그것은 모두 역사적인 설정의 일부입니다. listen 번 을 준비합니다.acceptListen은 또한 백로그를 설정할 수 있게 해줍니다. 백로그는 시스템에 의해 허용될 연결의 수를 설정하고 프로그램이 정말로 허용될 때까지 기다립니다.밀린 일이 가득 찬 후에 오는 모든 것은 시스템에서 즉시 거부됩니다. listen차단하지 반면에accept다음 연결이 이루어질 때까지 (소켓이 비슬롯 모드가 아닌 경우) 차단합니다.분명히, 이것은 두 개의 별개의 기능일 필요는 없습니다 - 그것은 생각할 수 있습니다.accept() 것을 할 수 .listen 그렇습니다.

위의 두 답변은 수락과 경청의 차이를 명확하게 설명합니다.다른 질문에 답하자면, 왜 우리는 두 개의 별도 기능이 필요합니까?

한 가지 사용 사례는 예를 들어 포트가 여전히 사용 가능한지 또는 포트에 액세스할 수 있는지 여부만 테스트하려는 경우 포트를 청취한 다음 연결을 수락하지 않고 포트를 닫으면 됩니다.

예: https://github.com/coolaj86/golang-test-port 의 경우 수신 대기 호출을 사용하여 포트의 가용성을 테스트합니다.

listen()대기 중인 최대 연결 수를 지정하는 백로그 매개 변수를 사용하며 0 이상이어야 합니다.서버가 동시에 많은 연결 요청을 수신함에 따라 값이 증가합니다.

accept()수신 연결을 기다립니다.클라이언트가 연결되면 연결을 나타내는 새 소켓 개체를 반환합니다.

주의해야 할 또 다른 중요한 점입니다.accept()클라이언트와 통신하는 데 사용할 새 소켓 개체를 만듭니다.서버가 새 연결을 허용하기 위해 사용하는 수신 소켓과 다릅니다.

응용 프로그램과 TCP/IP 소켓 인터페이스 간의 각 연결당 허용되는 최대 소켓 수는 65535개입니다.

언급URL : https://stackoverflow.com/questions/34073871/socket-programming-whats-the-difference-between-listen-and-accept

반응형