VTrain/tools/rtsp_server/net/TcpSocket.cpp

89 lines
1.5 KiB
C++

// PHZ
// 2018-5-15
#include "TcpSocket.h"
#include "Socket.h"
#include "SocketUtil.h"
#include "Logger.h"
using namespace xop;
TcpSocket::TcpSocket(SOCKET sockfd)
: sockfd_(sockfd)
{
}
TcpSocket::~TcpSocket()
{
}
SOCKET TcpSocket::Create()
{
sockfd_ = ::socket(AF_INET, SOCK_STREAM, 0);
return sockfd_;
}
bool TcpSocket::Bind(std::string ip, uint16_t port)
{
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip.c_str());
addr.sin_port = htons(port);
if(::bind(sockfd_, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
LOG_DEBUG(" <socket=%d> bind <%s:%u> failed.\n", sockfd_, ip.c_str(), port);
return false;
}
return true;
}
bool TcpSocket::Listen(int backlog)
{
if(::listen(sockfd_, backlog) == SOCKET_ERROR) {
LOG_DEBUG("<socket=%d> listen failed.\n", sockfd_);
return false;
}
return true;
}
SOCKET TcpSocket::Accept()
{
struct sockaddr_in addr = {0};
socklen_t addrlen = sizeof addr;
SOCKET socket_fd = ::accept(sockfd_, (struct sockaddr*)&addr, &addrlen);
return socket_fd;
}
bool TcpSocket::Connect(std::string ip, uint16_t port, int timeout)
{
if(!SocketUtil::Connect(sockfd_, ip, port, timeout)) {
LOG_DEBUG("<socket=%d> connect failed.\n", sockfd_);
return false;
}
return true;
}
void TcpSocket::Close()
{
#if defined(__linux) || defined(__linux__)
::close(sockfd_);
#elif defined(WIN32) || defined(_WIN32)
closesocket(sockfd_);
#else
#endif
sockfd_ = 0;
}
void TcpSocket::ShutdownWrite()
{
shutdown(sockfd_, SHUT_WR);
sockfd_ = 0;
}