📄 gsocket.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 + -