VTrain/tools/rtsp_server/net/Acceptor.cpp

73 lines
1.3 KiB
C++

#include "Acceptor.h"
#include "EventLoop.h"
#include "SocketUtil.h"
#include "Logger.h"
using namespace xop;
Acceptor::Acceptor(EventLoop* eventLoop)
: event_loop_(eventLoop)
, tcp_socket_(new TcpSocket)
{
}
Acceptor::~Acceptor()
{
}
int Acceptor::Listen(std::string ip, uint16_t port)
{
std::lock_guard<std::mutex> locker(mutex_);
if (tcp_socket_->GetSocket() > 0) {
tcp_socket_->Close();
}
SOCKET sockfd = tcp_socket_->Create();
channel_ptr_.reset(new Channel(sockfd));
SocketUtil::SetReuseAddr(sockfd);
SocketUtil::SetReusePort(sockfd);
SocketUtil::SetNonBlock(sockfd);
if (!tcp_socket_->Bind(ip, port)) {
return -1;
}
if (!tcp_socket_->Listen(1024)) {
return -1;
}
channel_ptr_->SetReadCallback([this]() { this->OnAccept(); });
channel_ptr_->EnableReading();
event_loop_->UpdateChannel(channel_ptr_);
return 0;
}
void Acceptor::Close()
{
std::lock_guard<std::mutex> locker(mutex_);
if (tcp_socket_->GetSocket() > 0) {
event_loop_->RemoveChannel(channel_ptr_);
tcp_socket_->Close();
}
}
void Acceptor::OnAccept()
{
std::lock_guard<std::mutex> locker(mutex_);
SOCKET socket = tcp_socket_->Accept();
if (socket > 0) {
if (new_connection_callback_) {
new_connection_callback_(socket);
}
else {
SocketUtil::Close(socket);
}
}
}