generated from zhangwei/Matrixai
89 lines
1.5 KiB
C++
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;
|
|
}
|