⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpsocket.cpp

📁 跨操作系统的微型中间件
💻 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 + -