📄 tcpsocket.cpp
字号:
/* File: TCPSocket.cpp Contains: implements TCPSocket class */#ifndef __Win32__#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#endif#include <errno.h>#include "TCPSocket.h"#include "SocketUtils.h"#include "OSThread.h"#include "OS.h"#include "LogInterface.h"#ifdef USE_NETLOG#include <netlog.h>#endifusing namespace std;Bool TCPSocket::SnarfSocket( TCPSocket & fromSocket ){ // take the connection away from the other socket // and use it as our own. Assert(fFileDesc == kInvalidFileDesc); if(!Set( fromSocket.fFileDesc, &fromSocket.fRemoteAddr )) return FALSE; // clear the old socket so he doesn't close and the like struct sockaddr_in remoteaddr; ::memset( &remoteaddr, 0, sizeof( remoteaddr ) ); if(!fromSocket.Set( kInvalidFileDesc, &remoteaddr )) return FALSE; return TRUE;}Bool TCPSocket::Set(int inSocket, const struct sockaddr_in* remoteaddr /*=NULL*/){ fFileDesc = inSocket; if ( inSocket != kInvalidFileDesc ) { //make sure to find out what IP address this connection is actually occuring on. That //way, we can report correct information to clients asking what the connection's IP is#if __Win32__ int len = sizeof(fLocalAddr);#else socklen_t len = sizeof(fLocalAddr);#endif int err = ::getsockname(fFileDesc, (struct sockaddr*)&fLocalAddr, &len); if( err != 0) { ERR_LOGGER(LOG_ERR_LEVEL_WARNING,LOG_MODULE_OS,errno,"Get local socketname failed,Maybe FD is invalid"); return FALSE; } if(!remoteaddr) { len=sizeof(fRemoteAddr); err=::getpeername(fFileDesc,(struct sockaddr*)&fRemoteAddr,&len); //If FD client shutdown before this. Error happend. if(err != 0) { ERR_LOGGER(LOG_ERR_LEVEL_WARNING,LOG_MODULE_OS,errno,"Can not get remote name,Maybe client shutdown"); return FALSE; } } else { fRemoteAddr = *remoteaddr; } fState |= kBound; fState |= kConnected; return TRUE; } else fState = 0; return FALSE;}string TCPSocket::GetRemoteAddrStr(){ if (fRemoteStr.empty()) SocketUtils::ConvertAddrToString(fRemoteAddr.sin_addr, &fRemoteStr); return fRemoteStr;}OS_Error TCPSocket::Connect(UInt32 inRemoteAddr, UInt16 inRemotePort){ if(!(fState & kConnected)) { ::memset(&fRemoteAddr, 0, sizeof(fRemoteAddr)); fRemoteAddr.sin_family = AF_INET; /* host byte order */ fRemoteAddr.sin_port = htons(inRemotePort); /* short, network byte order */ fRemoteAddr.sin_addr.s_addr = htonl(inRemoteAddr); /* don't forget to error check the connect()! */ int err = ::connect(fFileDesc, (sockaddr *)&fRemoteAddr, sizeof(fRemoteAddr)); if (err == -1) { fRemoteAddr.sin_port = 0; fRemoteAddr.sin_addr.s_addr = 0; return (OS_Error)OS::GetErrno(); } fState |= kConnected; } return OS_NoErr;}OS_Error TCPSocket::Listen(UInt32 inAcceptCount){ if (::listen(fFileDesc,inAcceptCount) == -1) { ERR_LOGGER(LOG_ERR_LEVEL_WARNING,LOG_MODULE_OS,errno,"TCP listen failed"); return OS_Err; } return OS_NoErr;}Int32 TCPSocket::Accept(TCPSocket *v_Socket){#if __Win32__ int len = sizeof(fRemoteAddr);#else socklen_t len = sizeof(fRemoteAddr);#endif Int32 fHandle=::accept(fFileDesc,(struct sockaddr*)&fRemoteAddr,&len); if(fHandle == -1) { //ERR_LOGGER(LOG_ERR_LEVEL_WARNING,LOG_MODULE_OS,errno,"Accept client failed"); return -1; } if(v_Socket) { if(!v_Socket->Set(fHandle,(struct sockaddr_in*)&fRemoteAddr)) { return -1; } } return fHandle;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -