boost::asio::socket
을 사용하여 RTMP 프로토콜을 구현 중입니다.블로킹 또는 비동기 boost :: asio :: socket을 사용하여 프로토콜 핸드 셰이크 구현 읽기/쓰기
async_accept 후에 프로토콜에 3 단계 핸드 셰이크가 필요합니다. 그렇지 않은 경우는 false (연결이 아직 처리하지 중단), 핸드 쉐이크가 (다음 RtmpConnection :: HandleData가 호출됩니다) 성공했을 경우
.
.
.
void RtmpServer::StartAsyncAccept()
{
// Create a new connection
nextConn = RtmpConnection::Create(this, ios);
// FIXME: shall we use async or blocking accept???
acceptor.async_accept
(
nextConn->GetSocket(),
boost::bind
(
&RtmpServer::HandleAsyncAccept,
this,
boost::asio::placeholders::error
)
);
}
.
.
.
void RtmpServer::HandleAsyncAccept(const boost::system::error_code& ec)
{
if (!ec)
{
if (nextConn->StartHandshake())
{
// Push the current connection to the queue
AddConnection(nextConn);
boost::array<char, 0> dummyBuffer;
nextConn->GetSocket().async_read_some
(
// TODO: use a strand for thread-safety.
boost::asio::buffer(dummyBuffer), // FIXME: Why boost::asio::null_buffers() not working?
boost::bind
(
&RtmpConnection::HandleData,
nextConn,
boost::asio::placeholders::error
)
);
}
}
// Start to accept the next connection
StartAsyncAccept();
}
RtmpConnection::StartHandshake
는 true를 돌려줍니다 : 아래의 코드를 참조하십시오.
핸드 셰이크에는 세 가지 주요 단계가 있으며 각각 Cx 및 Sx 메시지가 포함됩니다 (예 : C{0,1,2}
, S{0,1,2}
).
기본 악수 따라야합니다
// HANDSHAKE PROTOCOL
// Handshake Sequence:
// The handshake begins with the client sending the C0 and C1 chunks.
//
// The client MUST wait until S1 has been received before sending C2.
// The client MUST wait until S2 has been received before sending any
// other data.
//
// The server MUST wait until C0 has been received before sending S0 and
// S1, and MAY wait until after C1 as well. The server MUST wait until
// C1 has been received before sending S2. The server MUST wait until C2
// has been received before sending any other data.
당신이 (평소처럼), 악수은 기다려야합니다, 것으로 나타났습니다 수 있기 때문이다. 예 :
서버는 S0을 보내기 전에 util C0을 수신해야합니다. 우리의 경우 C0은 1 바이트 버전의 정수만 포함하고 서버는 버전이 유효한지 확인한 다음 S0을 클라이언트에 보냅니다.
등등, C1/S1, C2/S2와 비슷합니다 (그러나 약간 다릅니다).
제 질문은이 핸드 셰이크에 대한 읽기/쓰기 차단을 사용해야합니까, 아니면 비동기입니까?
현재 구현하기가 쉬운 읽기/쓰기 차단 기능을 사용하고 있습니다.
그러나 많은 사람들이 비동기 읽기/쓰기를 제안한다는 사실을 알게되었습니다. 더 나은 성능과 유연성이 있기 때문입니다.
비동기 소켓 읽기/쓰기를 사용하여 구현하려는 경우 어떻게해야합니까? 이 3 가지 주요 단계에 대한 핸들러를 만들어야합니까? 또는 다른 좋은 제안.
의사 코드 샘플을 보내 주시면 감사하겠습니다.
답장을 보내 주셔서 감사합니다. 확실히, 내 서버가 100 개 이상의 연결을 동시에 수용 할 것으로 예상되므로 (1)을 사용해야합니다. 연결 당 하나의 스레드가 잘 확장되지 않습니다. 작성한 샘플 코드는 현재 비동기로 전환하면 수행 할 계획이지만, 구현하기에는 지루한 일입니다. 핸드 셰이크에는 3 단계가 필요하기 때문에 많은 핸들러가있을 것입니다. BTW, 나에게 상태 머신에 대한 더 많은 정보를 소개하고 단일 읽기/쓰기 콜백을 구현하는 방법은 무엇입니까? 감사. –
libtorrent에서 피어 연결 객체를 살펴볼 수 있습니다. http://libtorrent.svn.sourceforge.net/viewvc/libtorrent/trunk/src/bt_peer_connection.cpp?revision=5948&view=markup 여기서 asio는 asio 위에 조금 더 추상화되어 있습니다. 보내기/받기 버퍼와 비동기 읽기 및 쓰기를 다시 시작하는 기본 연결 객체가 있습니다. 속도 제한 지원으로 인해 코드가 좀 더 복잡해졌습니다. 즉, 연결에 대역폭 할당량이 맞지 않아 읽기 또는 쓰기가되지 않는 경우가 있습니다. – Arvid