2013-01-17 5 views
3

이것이 내 시나리오입니다. 단일 스레드에서 소켓에 여러 비동기 쓰기가 요청됩니다. 같은 스레드가 io_service::run을 호출합니다. 따라서 모든 완료 핸들러는 해당 비동기 쓰기가 시작된 순서와 동일한 순서로 실행된다고 가정합니다. 마지막 완료 핸들러에서 소켓을 종료하고 닫을 수 있습니까?소켓을 비동기 적으로 닫는 방법

편집 : TCP 프로토콜을 사용하고 있습니다.

+1

적어도 Boost.Asio에서 단일 소켓에 대해 다중 비동기 쓰기를 호출하는 것은 안전하지 않습니다. 단일 소켓에 대해 비동기 읽기 및 쓰기 만 활성화 할 수 있습니다. – weggo

+0

지적 해 주셔서 고맙습니다. – pic11

답변

3

async_write() 완료 핸들러 내에서 async_write()을 호출 할 수 있습니다. 의사 코드는 documentation 명시 적으로 하나의 뛰어난 작업이 상태가 될 수 있습니다 것을

boost::asio::io_service ios; 
boost::asio::ip::tcp::socket socket(ios); 

void 
handler2() 
{ 
    socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both); 
    socket.close(); 
} 

void 
handler1() 
{ 
    async_write(socket, boost::bind(&handler2)); 
} 

int 
main() 
{ 
    async_write(socket, boost::bind(&handler1)); 
} 

주 이하에서 비행 :

이 작업은 스트림의 async_write_some 기능에 0 개 이상의 통화의 관점에서 구현되는

로 구성되며 구성된 작업으로 알려져 있습니다. 프로그램은 쓰기 작업 (async_write, 스트림 async_write_some 함수 또는 작성 작업을 수행하는 다른 구성된 작업)을 번 수행하지 않도록해야합니다.이 작업이 완료되면 이 작업이 완료됩니다. 단일 소켓에서 여러 async_write() 작업을 호출하는 이유

나쁜 생각입니다. 또는 scatter operation을 사용하여 async_write()에 두 버퍼를 모두 보냅니다.

+0

당신이 내 대답의 결함을 지적 했으므로 그것을 삭제했습니다. 이제는 TCP vs UDP에 관한 비트를 여기에 추가하기 만하면 답변이 정확하고 완전해질 것입니다. 어쨌든 +1하십시오. –

+0

그리고 왜이 경우에는'bind'를 사용해야합니까? –

+0

@Yam 질문은 TCP 소켓에만 해당됩니다. 내 의사 코드에서'boost :: bind()'를 사용했다. 왜냐하면 [asio examples] (http://www.boost.org/doc/libs/release/doc/html/boost_asio/example/echo /async_tcp_echo_server.cpp)은 매우 유사한 기술을 사용합니다. –

0

UDP 소켓이 연결되어 있지 않으므로 TCP 소켓이 있다고 가정합니다.

이 같은 것을 할 경우 소켓의 close 방법이 완료 핸들러가 호출됩니다 후

start_async_write(first) 
start_async_write(second) -> close socket on complete 
io_service.run() 

모든 것이 괜찮아 질 것이다, 당신의 쓰기가 연재됩니다 run() 방법을 반환합니다.

+1

분명히 이것은 boost :: asio의 문서에 의해 잘못되었습니다. –

+1

'async_write()'는 이름처럼 비동기 적이기 때문에 첫 번째 작업이 완료되어 결정적 동작을 얻을 때까지는 두 번째 작업을 호출 할 수 없습니다. –

+0

왜 안 되니? 창문에서 async_write 그냥 후드 아래 WriteFile을 호출하십시오. 두 번째 쓰기는 처음 완료 될 때까지 보류 상태가됩니다. 완료 핸들러는 완료 포트의 FIFO 순서로 대기합니다. 많은 미결 쓰기를 작성하면 메모리 부족 상태가됩니다. – Lazin

관련 문제