2017-12-14 1 views
0

Networking TS을 사용하는 간단한 단일 스레드 TCP 서버를 작성하고 있습니다. 들어오는 연결을 수락하기 위해 std::experimental::net::ip::tcp::acceptor을 만들고 accept 멤버 함수를 호출합니다. 그러나 받아들이는 연결이 없으면 나는 그것을 차단하고 싶지 않습니다. 수락 자의 수락 여부를 어떻게 확인할 수 있습니까?basic_socket_acceptor가 수락 할 준비가되어 있는지 확인하십시오.

+1

실험용 기능을 사용하지는 않았지만 이전 소켓 API에서는 수신 대기중인 소켓에 대기중인 연결이 있는지 여부를 알기 위해 select를 사용할 수 있습니다. 실험적인 C++ API에는 아마도 그 방법이 있습니다. –

+0

사용중인 API가 [boost :: asio] (http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference.html)를 기반으로하고 있다고 생각하십니까? 그렇다면 거기에 '비동기 버전의'accept' (http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/basic_socket_acceptor/async_accept.html)가있을 것으로 기대합니다. 잘. –

+0

@SergeBallesta 네, 저도 알고 있습니다. – Lyberta

답변

0

궁극적으로 select을 호출 할 함수가있을 경우 race condition을 노출합니다. 올바른 방법은 acceptor를 non-blocking으로 설정하는 것입니다.

std::experimental::net::io_context context; 
std::experimental::net::ip::tcp::acceptor acceptor{context, 
    std::experimental::net::ip::tcp::endpoint{ 
    std::experimental::net::ip::tcp::v4(), 1234}}; 
acceptor.non_blocking(true); 
std::error_code error; 
while (true) 
{ 
    auto socket = acceptor.accept(error); 
    if (!error) 
    { 
     // Handle incoming connection 
    } 
    // Do other stuff 
} 
관련 문제