📄 mysocket.cpp
字号:
//MySocket.cpp#include <iostream>#include <sys/select.h>#include <unistd.h>#include <cstring>#include <errno.h>#include "MySocket.h"using namespace std ;typedef unsigned char BYTE ;//==================== MyConnect ====================MyConnect::MyConnect(){}//MyConnectMyConnect::~MyConnect(){ shutdown() ;}//~MyConnectbool MyConnect::open(int domain/*AF_INET*/ , int type/*SOCK_STREAM*/ , int protocol/*0*/){ shutdown() ; m_socket = socket(domain , type , protocol) ; if (-1 == m_socket) { return false ; }//if return true ;}//openbool MyConnect::connect(const char *server , int port/*2404*/ , int domain/*AF_INET*/){ sockaddr_in m_server ; bzero(&m_server , sizeof m_server) ; m_server.sin_family = domain ; m_server.sin_port = htons(port) ; m_server.sin_addr.s_addr = inet_addr(server) ; if (-1 == ::connect(m_socket , reinterpret_cast<sockaddr *>(&m_server) , sizeof m_server)) { return false ; }//if return true ;}//connectMyConnect::operator int() const{ return m_socket ;}//operator intbool MyConnect::shutdown(int how/*2*/) const{ ::shutdown(m_socket , how) ; return true ;}//shutdown//==================== MyListen ====================MyListen::MyListen(int domain/*AF_INET*/ , int type/*SOCK_STREAM*/ , int protocol/*0*/){ m_socket = socket(domain , type , protocol) ;}//MyListenMyListen::~MyListen(){ shutdown(m_socket) ;}//~MyListenbool MyListen::shutdown(int socket , int how/*2*/) const{ if (-1 == ::shutdown(socket , how)) { return false ; }//if return true ;}//shutdownbool MyListen::bind(const char *server/*""*/ , int port/*2404*/ , int domain/*AF_INET*/){ bzero(&m_server , sizeof m_server) ; m_server.sin_family = domain ; m_server.sin_port = htons(port) ; if (0 != strlen(server)) { m_server.sin_addr.s_addr = inet_addr(server) ; }//if if (-1 == ::bind(m_socket , reinterpret_cast<sockaddr *>(&m_server) , sizeof m_server)) { return false ; }//if return true ; }//bindbool MyListen::listen(int backlog/*5*/) const{ if (-1 == ::listen(m_socket , backlog)) { return false ; }//if return true ;}//listenint MyListen::accept(string &ip){ socklen_t length = sizeof m_client ; bzero(&m_client , length) ; int socket = ::accept(m_socket , reinterpret_cast<sockaddr *>(&m_client) , &length) ; if (-1 == socket) { return -1 ; }//if else if (sizeof m_client != length) { return -1 ; }//else if ip = inet_ntoa(m_client.sin_addr) ; return socket ;}//accept//==================== MySocket ====================MySocket::MySocket(){ m_reset = true ; m_socket = -1 ;}//MySocketMySocket::~MySocket(){ shutdown() ;}//~MySocketbool MySocket::needReset() const{ return m_reset ;}//needResetMySocket & MySocket::operator =(const MyConnect &connect){ shutdown() ; m_socket = connect ; m_reset = false ; return *this ;}//operator =MySocket & MySocket::operator =(int socket){ shutdown() ; m_socket = socket ; m_reset = false ; return *this ;}//operator =int MySocket::receive(void *buf , int len , int time_out/*5*/ , unsigned int flags/*0*/){ if (m_reset) { return -1 ; }//if memset(buf , 0 , len) ; int result = 0 ; fd_set readfds ; timeval timeout ; int retval = 0 ; int error_time = 0 ; while (result < len) { FD_ZERO(&readfds) ; FD_SET(m_socket , &readfds) ; timeout.tv_sec = time_out ; timeout.tv_usec = 0 ; retval = select(m_socket + 1 , &readfds , NULL , NULL , &timeout) ; if (retval) { if (FD_ISSET(m_socket , &readfds)) { retval = recv(m_socket , static_cast<BYTE *>(buf) + result , len - result , flags) ; if (-1 == retval) { m_reset = true ; return -1 ; }//if result += retval ; error_time = 0 ; continue ; }//if else { m_reset = true ; return -1 ; }//else }//if else if (0 == retval) { //cout << " Read Select Timeout ! Want To Read : " << len << " , Have Read : " << result << endl << endl ; }//else if else { m_reset = true ; return -1 ; }//else if (++error_time > 2) { break ; }//if }//while if (0 == result) { //cout << " No Data ! " << endl << endl ; }//if return result ;}//receiveint MySocket::send(const void *msg , int len , unsigned int flags/*0*/){ if (m_reset) { return -1 ; }//if int result = ::send(m_socket , msg , len , flags) ; if (-1 == result) { m_reset = true ; return -1 ; }//if else if (len != result) { return -1 ; }//else if if (0 == result) { cout << " No Data ! " << endl << endl ; return -1 ; }//if return result ;}//sendbool MySocket::shutdown(int how/*2*/){ ::shutdown(m_socket , how) ; m_reset = true ; m_socket = -1 ; return true ;}//shutdown
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -