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

📄 censocket.cpp

📁 客户端的代码实现
💻 CPP
字号:
#include "CenSocket.h"

#include "FCDReceive.h"

CCenSocket::CCenSocket(void *pParent, string strIP, unsigned short uPort, int iProtocol)
{
	CCenSocket();
	SetPara(pParent, strIP, uPort, iProtocol);

	//m_bIsReady = false;
}

CCenSocket::CCenSocket()
{
	m_sock = INVALID_SOCKET;

#ifdef _WIN32_
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);
#endif

}

CCenSocket::~CCenSocket(void)
{
}

///////////////////////////////////////////////////////////
//设置SOCKET参数。
void CCenSocket::SetPara(void *pParent, string strIP, unsigned short uProt, int iProtocol)
{
	m_strSvrIP = strIP;
	m_uSvrPort = uProt;
	m_iProtocol = iProtocol;

	m_sock = INVALID_SOCKET;

	m_pParent = (CFCDReceive *)pParent;

	//==================================================
	m_sockaddr_in.sin_addr.s_addr = inet_addr(m_strSvrIP.c_str());
	m_sockaddr_in.sin_family = AF_INET;
	m_sockaddr_in.sin_port = htons(m_uSvrPort);

	//如果不是ip的话,进行地址解析
	if (m_sockaddr_in.sin_addr.s_addr == INADDR_NONE)
	{
		struct hostent *host = NULL;
		host = gethostbyname(m_strSvrIP.c_str());
		if (host == NULL)
		{
			cerr<<"无法解析主机地址: "<<m_strSvrIP.c_str()<<endl;
			return;
		}

		memcpy(&m_sockaddr_in.sin_addr, host->h_addr_list[0], host->h_length);
	}

}

///////////////////////////////////////////////////////////
//对SOCKET初始化
bool CCenSocket::Init()
{
	if (m_sock == INVALID_SOCKET)
	{
		//创建SOCKET
		if (!Create())
		{
			return false;
		}
	}

	//连接服务器,如果为UDP方式,则不用连接
	if (m_iProtocol == SOCK_STREAM)
	{
		if (!Connect(m_strSvrIP, m_uSvrPort))
		{
			printf("SOCKET不能连接到服务器. \r\n");
			return false;
		}
	}
	else//UDP:绑定IP及端口
	{
		if (SOCKET_ERROR == bind(m_sock, (SOCKADDR *) &m_sockaddr_in, sizeof(m_sockaddr_in)))
		{
			return false;
		}
	}

	return true;
}


///////////////////////////////////////////////////////////
//创建套接字
bool CCenSocket::Create()
{
	if (m_sock == INVALID_SOCKET)
	{
		if (m_iProtocol == SOCK_DGRAM)
		{
			m_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
		}
		else
		{
			m_sock = socket(AF_INET, SOCK_STREAM, 0);
		}
		
	}

	if (m_sock != INVALID_SOCKET)
	{
		return true;
	}

	if (m_iProtocol == SOCK_STREAM)
	{
		int ret;

		//设置重用
		int nREUSEADDR = 1;
		setsockopt(m_sock,  SOL_SOCKET,  SO_REUSEADDR, (const char*)&nREUSEADDR, sizeof(int));

		//设置非阻塞方式连接
		unsigned long ul = 1;
		ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul);
		if(ret==SOCKET_ERROR)return 0;
	}
	
	
	return false;
}

///////////////////////////////////////////////////////////////
//连接服务器
bool CCenSocket::Connect(string strIP, unsigned short uPort)
{
	if (m_iProtocol != SOCK_STREAM && m_sock == INVALID_SOCKET)
	{
		return false;
	}

	int icnn = connect(m_sock, (sockaddr*)&m_sockaddr_in, sizeof (m_sockaddr_in));
	//错误处理
	if (icnn == SOCKET_ERROR)
	{
		return false;
	}
	else
	{
		return true;
	}

}

///////////////////////////////////////////////////////////////
bool CCenSocket::BeginRec()
{
	assert(m_sock != INVALID_SOCKET);

	if (m_iProtocol == SOCK_STREAM )
	{
		Receive();
	}
	else if (m_iProtocol == SOCK_DGRAM)
	{
		ReceiveFrom();
	}

	//网络中断,返回了
	//m_bIsReady = false;

	return false;
}


/////////////////////////////////////////////////////////////////
//tcp 方式接收数据
void CCenSocket::Receive()
{
	assert(m_iProtocol == SOCK_STREAM);

	int iRec = 0;
	char buff[524288] = {0};

	while(1)
	{
		int iRec;

		iRec = recv(m_sock, buff, 524287, 0);
		
		if ( iRec <= 0)
		{
			closesocket(m_sock);
			m_sock = INVALID_SOCKET;
			return;
		}

		m_pParent->OnReceiveData(buff, iRec);
	}

	return;
}

///////////////////////////////////////////////////////////////
//udp 方式接收数据
void CCenSocket::ReceiveFrom()
{
	assert(m_iProtocol == SOCK_DGRAM);

	int iRec = 0;
	char buff[1000000]={0};
	
	sockaddr_in SenderAddr;
	int iPort = sizeof(SenderAddr);
	int iCnt = 0;
	
	//m_bIsReady = true;

	while(1)
	{
		//得到数据
		iRec = recvfrom(m_sock, buff, 1000000, 0, (SOCKADDR*)&SenderAddr, &iPort);
		
		if (iRec < 0)
		{
			continue;
		}

		buff[iRec] = NULL;

		m_pParent->OnReceiveData(buff, iRec);
	}
}

///////////////////////////////////////////////////////////////
//数据发送
int CCenSocket::Send(char *pString, int iLength)
{
	int iSnd  = 0;
	if (m_iProtocol == SOCK_STREAM && m_sock != INVALID_SOCKET)
	{
		iSnd = send(m_sock, pString, iLength, 0);
	}

	return iSnd;
}

///////////////////////////////////////////////////////////////
//关闭SOCKET链接
int CCenSocket::Close()
{
	shutdown(m_sock, 0x02);

	return closesocket(m_sock);
}

⌨️ 快捷键说明

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