void CSockWrap::Reopen(bool bForceClose) { if (ISSOCKHANDLE(m_hSocket) && bForceClose) SocketClose(m_hSocket); if (!ISSOCKHANDLE(m_hSocket) ) { m_hSocket=SocketOpen(m_tcpudp); } }
int SocketTimeOut(HSocket hs, int recvtimeout, int sendtimeout, int lingertimeout) //in milliseconds { int rt=-1; if (ISSOCKHANDLE(hs) ) { rt=0; #if defined(_WIN32_PLATFORM_) if(lingertimeout>-1) { struct linger lin; lin.l_onoff = lingertimeout; lin.l_linger = lingertimeout ; rt = setsockopt(hs,SOL_SOCKET,SO_DONTLINGER,(const char*)&lin,sizeof(linger)) == 0 ? 0:0x1; } if(recvtimeout>0 && rt == 0) { rt = rt | (setsockopt(hs,SOL_SOCKET,SO_RCVTIMEO,(char*)&recvtimeout,sizeof(int))==0?0:0x2); } if(sendtimeout>0 && rt == 0) { rt = rt | (setsockopt(hs,SOL_SOCKET, SO_SNDTIMEO, (char*)&sendtimeout,sizeof(int))==0?0:0x4); } #endif #if defined(_LINUX_PLATFORM_) struct timeval timeout; if(lingertimeout>-1) { struct linger lin; lin.l_onoff = lingertimeout>0?1:0; lin.l_linger = lingertimeout/1000 ; rt = setsockopt(hs,SOL_SOCKET,SO_LINGER,(const char*)&lin,sizeof(linger)) == 0 ? 0:0x1; } if(recvtimeout>0 && rt == 0) { timeout.tv_sec = recvtimeout/1000; timeout.tv_usec = (recvtimeout % 1000)*1000; rt = rt | (setsockopt(hs,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout))==0?0:0x2); } if(sendtimeout>0 && rt == 0) { timeout.tv_sec = sendtimeout/1000; timeout.tv_usec = (sendtimeout % 1000)*1000; rt = rt | (setsockopt(hs,SOL_SOCKET, SO_SNDTIMEO, &timeout,sizeof(timeout))==0?0:0x4); } #endif } return rt; }
void SocketClose(HSocket& handle) { if(ISSOCKHANDLE(handle)) { #if defined(_WIN32_PLATFORM_) closesocket(handle); #endif #if defined(_LINUX_PLATFORM_) close(handle); #endif handle = INVALIDSOCKHANDLE; } }
int CSockWrap::SetBufferSize(int recvbuffersize, int sendbuffersize) //in bytes { int rt=-1; if (ISSOCKHANDLE(m_hSocket) ) { #if defined(_WIN32_PLATFROM_) if(recvbuffersize>-1) { rt = setsockopt( m_hSocket, SOL_SOCKET, SO_RCVBUF, ( const char* )&recvbuffersize, sizeof( int ) ); } if(sendbuffersize>-1) { rt = rt | (setsockopt(m_hSocket,SOL_SOCKET,SO_SNDBUF,(char *)&sendbuffersize,sizeof(int))==0?0:0x2); } #endif } return rt; }
int SocketBlock(HSocket hs, bool bblock) { unsigned long mode; if( ISSOCKHANDLE(hs)) { #if defined(_WIN32_PLATFROM_) mode = bblock?0:1; return ioctlsocket(hs,FIONBIO,&mode); #endif #if defined(_LINUX_PLATFORM_) mode = fcntl(hs, F_GETFL, 0); //获取文件的flags值。 //设置成阻塞模式 非阻塞模式 return bblock?fcntl(hs,F_SETFL, mode&~O_NONBLOCK): fcntl(hs, F_SETFL, mode | O_NONBLOCK); #endif } return -1; }
bool IsValidSocketHandle(HSocket handle) { return ISSOCKHANDLE(handle); }