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

📄 socketobject.cpp

📁 主要用于http://www.doctorcom.com/开发的dr.com宽带记费系统
💻 CPP
字号:
#include"SocketObject.h"




SocketObject::SocketObject()
{
	WSADATA  wsaData;
	WORD     wVersionRequested;
	wVersionRequested=MAKEWORD(2,2);
	skSocket=INVALID_SOCKET;
	WSAStartup(wVersionRequested,&wsaData);

}

SocketObject::~SocketObject()
{
	Disconnect();
	//WSACleanup();
}

bool SocketObject::Create(AF af,SOCKTYPE socktype,PROTOCAL protocal)
{
	skSocket=socket(af,socktype,protocal);
	if(skSocket==INVALID_SOCKET)
		return false;
	return true;
}

bool SocketObject::Bind(int iPort)
{
	char hostname[128];
	sockaddr_in saServerAddress;
	hostent* pHostIP;
	if(skSocket==INVALID_SOCKET)
		return false;
	memset(&saServerAddress,0,sizeof(saServerAddress));
	gethostname(hostname,sizeof(hostname));
	
    pHostIP=gethostbyname(hostname);
	saServerAddress.sin_family=AF_INET;
	saServerAddress.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	saServerAddress.sin_port=htons(iPort);
	//saServerAddress.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];
	if(bind(skSocket,(sockaddr*)&saServerAddress,sizeof(sockaddr))==SOCKET_ERROR)
	{
		Disconnect();
		return false;
	}
	return true;
}

void SocketObject::Disconnect()
{
	if(skSocket!=INVALID_SOCKET)
	{
		shutdown(skSocket,SD_BOTH);   //SD_RECEIVE  SD_SEND  SD_BOTH
		closesocket(skSocket);
		skSocket=INVALID_SOCKET;
	}
}

bool SocketObject::Listen(int waitnum)
{
	if(listen(skSocket,waitnum)==0)
		return true;
	return false;
}

bool SocketObject::Accept(SocketObject &skAcceptSocket)
{
	iClientSize=sizeof(sockaddr_in);
	skAcceptSocket.skSocket=accept(skSocket,(sockaddr*)&saClientAddress,&iClientSize);
	if(skAcceptSocket.skSocket==INVALID_SOCKET)
		return false;
	return true;
}

bool SocketObject::Connect(char *szServerAddress, int iPort)
{
	sockaddr_in  serv_addr;
	LPHOSTENT    lpHost;
	//int          err;
	//skSocket=socket(AF_INET,SOCK_STREAM,0);
	//if(skSocket==INVALID_SOCKET)
	//	return false;
	memset(&serv_addr,0,sizeof(sockaddr_in));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.S_un.S_addr=inet_addr(szServerAddress);
	if(serv_addr.sin_addr.S_un.S_addr==INADDR_NONE)
	{
		lpHost=gethostbyname(szServerAddress);
		if(lpHost!=NULL)
		{
			serv_addr.sin_addr.S_un.S_addr=((LPIN_ADDR)lpHost->h_addr_list[0])->S_un.S_addr;
		}
		else
			return false;
	}
	serv_addr.sin_port=htons(iPort);
	if(connect(skSocket,(sockaddr*)&serv_addr,sizeof(sockaddr))==SOCKET_ERROR)
	{
		Disconnect();
		return false;
	}
	return true;
}

int SocketObject::Send(char *szBuffer, int iBuflen, int iFlags)
{
	return send(skSocket,szBuffer,iBuflen,iFlags);
}

int SocketObject::Sendto(char* szBuffer,int iBuflen,char* addr,int port)
{
	sockaddr_in toAddr;
	LPHOSTENT    lpHost;
	memset(&toAddr,0,sizeof(sockaddr_in));
	toAddr.sin_family=AF_INET;
	toAddr.sin_addr.S_un.S_addr=inet_addr(addr);
	if(toAddr.sin_addr.S_un.S_addr==INADDR_NONE)
	{
		lpHost=gethostbyname(addr);
		if(lpHost!=NULL)
		{
			toAddr.sin_addr.S_un.S_addr=((LPIN_ADDR)lpHost->h_addr_list[0])->S_un.S_addr;
		}
		else
			return false;
	}
	toAddr.sin_port=htons(port);
	return sendto(skSocket,szBuffer,iBuflen,0,(sockaddr*)(&toAddr),sizeof(sockaddr_in));

}

int SocketObject::Recv(char *szBuffer, int iBuflen, int iFlags)
{
	return recv(skSocket,szBuffer,iBuflen,iFlags);
}

int SocketObject::Recvfrom(char *szBuffer, int iBuflen)
{
	sockaddr_in fromAddr;
	int fromlen=sizeof(fromAddr);
	return recvfrom(skSocket,szBuffer,iBuflen,0,(sockaddr*)(&fromAddr),&fromlen);
}
	

bool SocketObject::Setsockopt(int level, int optname, const char *optval, int optlen)
{
	if(setsockopt(skSocket,level,optname,optval,optlen)==SOCKET_ERROR)
		return false;
	return true;
}

string SocketObject::GetIP()
{
	return inet_ntoa(saClientAddress.sin_addr);
}

bool SocketObject::isAvailable()
{
	if(skSocket!=INVALID_SOCKET)
		return true;
	else
		return false;

}


⌨️ 快捷键说明

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