OpenRTMFP/Cumulus Primer(8)CumulusServerメインプロセスメインサイクル分析
5247 ワード
OpenRTMFP/Cumulus Primer(8)CumulusServerメインプロセスメインサイクル分析
作者:柳大・Poechant(鐘超)ブログ:Blog.CSDN.net/Poechant メールアドレス:zhongchao.ustc#gmail.com (# -> @)
日付:April 14 th、2012 この主ループは
1バインドアドレス
バインディング
送信者(Client)のIPアドレスとポート:
2
ソケットから読み込み:
buff,にデータを格納
送信者アドレスをsender,に割り当てる
読み取り長さをsize*/
2
3
プライマリ・スレッドは1秒待機します.
Just middle session
4送信者のipが禁止されています:
5可能な最小値未満のパケット長(12)
-
転載は柳大からのCSDNブログ:Blog.CSDN.net/Poechantを明記してください
-
作者:柳大・Poechant(鐘超)ブログ:Blog.CSDN.net/Poechant メールアドレス:zhongchao.ustc#gmail.com (# -> @)
日付:April 14 th、2012 この主ループは
RTMFPServer::run(const volatile bool& terminate)
関数にある.RTMFPServer
はStartable
のrun(const volatile bool &terminate)
方法をカバーする.void RTMFPServer::run(const volatile bool& terminate) {
1バインドアドレス
CumulusServer
のIPアドレスとポート: SocketAddress address("0.0.0.0",_port);
_socket.bind(address,true);
バインディング
CumulusEdge
のIPアドレスとポート: SocketAddress edgesAddress("0.0.0.0",_edgesPort);
if (_edgesPort>0)
_edgesSocket.bind(edgesAddress,true);
送信者(Client)のIPアドレスとポート:
SocketAddress sender;
UInt8 buff[PACKETRECV_SIZE];
int size = 0;
while (!terminate) {
bool stop=false;
bool idle = realTime(stop);
if(stop)
break;
_handshake.isEdges=false;
2
CumulusServer
受信データ:CumulusServer
のsocketはデータ読み取り可能です. if (_socket.available() > 0) {
try {
ソケットから読み込み:
buff,にデータを格納
送信者アドレスをsender,に割り当てる
読み取り長さをsize*/
size = _socket.receiveFrom(buff,sizeof(buff),sender);
に戻すCumulusServer
のsocketで発生した異常を処理します. } catch(Exception& ex) {
DEBUG("Main socket reception : %s",ex.displayText().c_str());
_socket.close();
_socket.bind(address,true);
continue;
}
2
CumulusEdge
ポートが存在し、edge socketが利用可能である場合.CumulusEdge
のsocketはデータ読み取り可能です. } else if (_edgesPort > 0 && _edgesSocket.available() > 0) {
try {
size = _edgesSocket.receiveFrom(buff, sizeof(buff), sender);
_handshake.isEdges = true;
} catch(Exception& ex) {
DEBUG("Main socket reception : %s", ex.displayText().c_str());
_edgesSocket.close();
_edgesSocket.bind(edgesAddress, true);
continue;
}
Edge* pEdge = edges(sender);
if (pEdge)
pEdge->update();
3
CumulusServer
とCumulusEdge
のsocketにはデータがありません. } else {
CumulusServer
アイドル: if (idle) {
プライマリ・スレッドは1秒待機します.
Thread::sleep(1);
if (!_timeLastManage.isElapsed(_freqManage)) {
Just middle session
if (_middle) {
Sessions::Iterator it;
for (it = _sessions.begin(); it != _sessions.end(); ++it) {
Middle* pMiddle = dynamic_cast<Middle*>(it->second);
if (pMiddle)
pMiddle->manage();
}
}
} else {
_timeLastManage.update();
manage();
}
}
continue;
}
4送信者のipが禁止されています:
if (isBanned(sender.host())) {
INFO("Data rejected because client %s is banned",
sender.host().toString().c_str());
continue;
}
5可能な最小値未満のパケット長(12)
if (size < RTMFP_MIN_PACKET_SIZE) {
ERROR("Invalid packet");
continue;
}
PacketReader packet(buff,size);
Session* pSession = findSession(RTMFP::Unpack(packet));
if (!pSession)
continue;
if (!pSession->checked)
_handshake.commitCookie(*pSession);
CumulusEdge
または自分(CumulusServer
)へのsocket: pSession->setEndPoint(_handshake.isEdges ? _edgesSocket : _socket,sender);
pSession->receive(packet);
}
_handshake.clear();
_sessions.clear();
_socket.close();
if (_edgesPort>0)
_edgesSocket.close();
if(_pCirrus) {
delete _pCirrus;
_pCirrus = NULL;
}
}
-
転載は柳大からのCSDNブログ:Blog.CSDN.net/Poechantを明記してください
-