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;
 | |
| }
 |