이것이 내 시나리오입니다. 단일 스레드에서 소켓에 여러 비동기 쓰기가 요청됩니다. 같은 스레드가 io_service::run
을 호출합니다. 따라서 모든 완료 핸들러는 해당 비동기 쓰기가 시작된 순서와 동일한 순서로 실행된다고 가정합니다. 마지막 완료 핸들러에서 소켓을 종료하고 닫을 수 있습니까?소켓을 비동기 적으로 닫는 방법
편집 : TCP 프로토콜을 사용하고 있습니다.
이것이 내 시나리오입니다. 단일 스레드에서 소켓에 여러 비동기 쓰기가 요청됩니다. 같은 스레드가 io_service::run
을 호출합니다. 따라서 모든 완료 핸들러는 해당 비동기 쓰기가 시작된 순서와 동일한 순서로 실행된다고 가정합니다. 마지막 완료 핸들러에서 소켓을 종료하고 닫을 수 있습니까?소켓을 비동기 적으로 닫는 방법
편집 : TCP 프로토콜을 사용하고 있습니다.
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()
에 두 버퍼를 모두 보냅니다.
당신이 내 대답의 결함을 지적 했으므로 그것을 삭제했습니다. 이제는 TCP vs UDP에 관한 비트를 여기에 추가하기 만하면 답변이 정확하고 완전해질 것입니다. 어쨌든 +1하십시오. –
그리고 왜이 경우에는'bind'를 사용해야합니까? –
@Yam 질문은 TCP 소켓에만 해당됩니다. 내 의사 코드에서'boost :: bind()'를 사용했다. 왜냐하면 [asio examples] (http://www.boost.org/doc/libs/release/doc/html/boost_asio/example/echo /async_tcp_echo_server.cpp)은 매우 유사한 기술을 사용합니다. –
UDP 소켓이 연결되어 있지 않으므로 TCP 소켓이 있다고 가정합니다.
이 같은 것을 할 경우 소켓의 close
방법이 완료 핸들러가 호출됩니다 후
start_async_write(first)
start_async_write(second) -> close socket on complete
io_service.run()
모든 것이 괜찮아 질 것이다, 당신의 쓰기가 연재됩니다 run()
방법을 반환합니다.
분명히 이것은 boost :: asio의 문서에 의해 잘못되었습니다. –
'async_write()'는 이름처럼 비동기 적이기 때문에 첫 번째 작업이 완료되어 결정적 동작을 얻을 때까지는 두 번째 작업을 호출 할 수 없습니다. –
왜 안 되니? 창문에서 async_write 그냥 후드 아래 WriteFile을 호출하십시오. 두 번째 쓰기는 처음 완료 될 때까지 보류 상태가됩니다. 완료 핸들러는 완료 포트의 FIFO 순서로 대기합니다. 많은 미결 쓰기를 작성하면 메모리 부족 상태가됩니다. – Lazin
적어도 Boost.Asio에서 단일 소켓에 대해 다중 비동기 쓰기를 호출하는 것은 안전하지 않습니다. 단일 소켓에 대해 비동기 읽기 및 쓰기 만 활성화 할 수 있습니다. – weggo
지적 해 주셔서 고맙습니다. – pic11