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

📄 gsocket.cpp

📁 网络极速寻呼源码
💻 CPP
字号:
/*GSocket是一个很简单的SOCKET类,写这个类的目的是为了写极速寻呼!不久以后我会写个更强大的SOCKET类,大家可以去小弟的主页上看看!*/
#include "GSocket.h"
//-----------------------------------------
unsigned long LocalIp()
{
char szipTemp[512];
unsigned long ip;
hostent *host;
if(gethostname(szipTemp,511)==SOCKET_ERROR)return INADDR_NONE;
host=gethostbyname(szipTemp);
if(host==NULL)return INADDR_NONE;
ip=*((unsigned long*)host->h_addr_list[0]);
return ip;
}
in_addr LocalAddr()
{
 in_addr inaddr;
 inaddr.s_addr=LocalIp();
 return inaddr;
}

unsigned long ServerToIp(char*_GServer)
{
unsigned long ip;
hostent *host;
if((ip=inet_addr(_GServer))==INADDR_NONE)
	{
		host=gethostbyname(_GServer);
		if(host)
			ip=*((unsigned long*)host->h_addr_list[0]);		
		else
			return INADDR_NONE;
	}
return ip;
}

GSocket::GSocket()
{
_GSocket=INVALID_SOCKET;
iocmd=1;
bCancel=false;
}
GSocket::~GSocket()
{
Close();
}
bool GSocket::Create()
{
     bCancel=false;
	if(_GSocket!=INVALID_SOCKET)Close();
	_GSocket=socket(AF_INET,SOCK_STREAM,0);
	if(_GSocket==INVALID_SOCKET)
		return 0;
	if(ioctlsocket(_GSocket,FIONBIO,&iocmd)==SOCKET_ERROR){Close();return false;}
	return 1;
}

int GSocket::Connect(char*Server,int Port,int TimeOut)
{
stime=1;etime=TimeOut;if(etime<1)etime=1;
sockaddr_in sock;
sock.sin_addr.s_addr=ServerToIp(Server);
if(sock.sin_addr.s_addr==INADDR_NONE)return GSOCKET_NOHOST;
sock.sin_family=AF_INET;
sock.sin_port=htons(Port);
int iRet=connect(_GSocket,(sockaddr*)&sock,sizeof(sock));
if(iRet==0)return stime;
else if(iRet==SOCKET_ERROR&&WSAGetLastError()==WSAEWOULDBLOCK)
{
iRet=Select(true);
if(iRet==SOCKET_ERROR||iRet==GSOCKET_ABORT)return iRet;
else if(iRet==2)return 0;
else if(iRet==1)return stime;
}
return SOCKET_ERROR;
}

int GSocket::ConnectIp(u_long Server,int Port,int TimeOut)
{
stime=1;etime=TimeOut;if(etime<1)etime=1;
sockaddr_in sock;
sock.sin_addr.s_addr=Server;
if(sock.sin_addr.s_addr==INADDR_NONE)return GSOCKET_NOHOST;
sock.sin_family=AF_INET;
sock.sin_port=htons(Port);
int iRet=connect(_GSocket,(sockaddr*)&sock,sizeof(sock));
if(iRet==0)return stime;
else if(iRet==SOCKET_ERROR&&WSAGetLastError()==WSAEWOULDBLOCK)
{
iRet=Select(true);
if(iRet==SOCKET_ERROR||iRet==GSOCKET_ABORT)return iRet;
else if(iRet==2)return 0;
else if(iRet==1)return stime;
}
return SOCKET_ERROR;
}

void GSocket::Cancel()
{
bCancel=true;
}

int GSocket::SetSelect(HWND hWnd,long levent)
{
return WSAAsyncSelect(_GSocket,hWnd,WM_GSOCKETSELECT,levent);
}

int GSocket::Send(char*szSendBuf,int iSendLength,int TimeOut)
{
int nLeft=iSendLength,nSend=0,ret;
stime=0;etime=TimeOut;if(etime<1)etime=1;
while(nLeft>0)
{
ret=Select(true);
if(ret==SOCKET_ERROR||ret==GSOCKET_ABORT)return ret;
else if(ret==2)return 0;
ret=send(_GSocket,szSendBuf+nSend,nLeft,0);
if(ret>=0)
{
nLeft-=ret;
nSend+=ret;
}
}
return nSend;
}

int GSocket::Receive(char*szReceiveBuf,int iReceiveLength,int TimeOut)
{
stime=0;etime=TimeOut;if(etime<1)etime=1;
int ret=Select(false);
if(ret==SOCKET_ERROR||ret==GSOCKET_ABORT)return ret;
else if(ret==2)return 0;
return recv(_GSocket,szReceiveBuf,iReceiveLength,0);
}
void GSocket::Close()
{
 if(_GSocket!=INVALID_SOCKET)
 {

	closesocket(_GSocket);
	_GSocket=INVALID_SOCKET;
}
bCancel=false;
}
int GSocket::Select(bool isSend)
{
int iRet;
fd_set _fd_set;
timeval _timeOut;
while(1)
{
if(stime>=etime)return 2;
else if(bCancel){bCancel=false;return GSOCKET_ABORT;}
FD_ZERO(&_fd_set);
FD_SET(_GSocket,&_fd_set);
_timeOut.tv_sec=0;
_timeOut.tv_usec=0;
if(isSend)
iRet=select(0,NULL,&_fd_set,NULL,&_timeOut);
else
iRet=select(0,&_fd_set,NULL,NULL,&_timeOut);
if(iRet)return iRet;
stime++;
Sleep(1000);
}
}
int GSocket::SetBuffer(bool isSend,int size)
{
if(isSend)return setsockopt(_GSocket,SOL_SOCKET,SO_SNDBUF,(char*)&size,sizeof(int));
else
return setsockopt(_GSocket,SOL_SOCKET,SO_RCVBUF,(char*)&size,sizeof(int));
}
bool GSocket::SetHandle(SOCKET tsk)
{
 if(_GSocket!=INVALID_SOCKET)Close();
 _GSocket=tsk;
 if(ioctlsocket(_GSocket,FIONBIO,&iocmd)==SOCKET_ERROR){Close();return false;}
return true;
}
bool GSocket::Active()
{
 return _GSocket!=INVALID_SOCKET;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -