2017-12-13 43 views
0

의 내가 청취 소켓을 만든 가정하자 :수락 이벤트에서 epoll을 할 수 있습니까?

sock = socket(...); 
bind(sock,...); 
listen(sock, ...); 

가 들어오는 연결을 기다릴 양말에에 epoll_wait을 할 수 있습니까? 어떻게해야 클라이언트 소켓을 얻을 수 있습니까?

문제는 소켓에 쓸 수있는 소켓이 비 차단이 될 수 없다는 것입니다.하지만 epoll 구현과 타임 아웃이 작동하며 연결을 수락하고 단일 스레드에서 작업해야합니다. 뭔가 잘못되어 연결이되지 않으면 멈추지 마십시오.

+1

예, 소켓을 non_blocking 모드로 설정해야하며 읽기 이벤트가 발생하면 승인을 받아야합니다. 예 : https : //stackoverflow.com/questions/29729561/asynchronous-c-client-for-a-multiclient-c-server –

+1

비 차단은 필요하지 않습니다. 청취 소켓이 * 읽기 쉽도록 폴링하십시오. –

답변

0

이 비표준 플랫폼이 무엇인지 알지 못하고 epoll 호출에 대한 의미를 정확히 알 수 없습니다. 하지만 Linux의 표준 epoll에서는 들어오는 연결이 수신되면 청취 소켓이 "읽기 가능"으로보고 된 다음 accept을 호출하여 연결을 수락 할 수 있습니다. 소켓을 블로킹 모드로 유지하고 각각 accept을 호출하기 전에 epoll의 레벨 트리거 모드를 사용하여 가독성을 검사하면이 이되어야합니다 - 유일한 위험은 연결이 이루어지지 않을 때 어떤 식 으로든 accept , 그러면 너는 꼼짝 못할거야. 예를 들어 수신 대기 소켓을 공유하는 두 개의 프로세스가 있고 둘 다 동일한 연결 인 accept을 시도하면이 문제가 발생할 수 있습니다. 또는 들어오는 연결이 도착하면 accept에 전화하기 전에 다시 닫힙니다. (물론이 경우 리눅스는 여전히 accept을 성공 시키지만, 이런 종류의 엣지 케이스는 내가 이상한 플랫폼을 의심스럽게 여기는 곳이다.) 이런 것들을 확인하고 싶을 것이다.

최악의 경우 accept은 받아 들일 것이 아무것도 없다고보고하기 때문에 비 차단 모드가 훨씬 더 안정적입니다. 하지만 그게 가능하지 않다면, 다음과 같은 것으로 빠져 나갈 수 있습니다.