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

📄 netclient.cpp

📁 EVC做的Windows Mobile 的H263网络视频
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			SetEvent(hExitEvent);//退出先前创建的线程
			return Error;
		}
		CloseHandle(ThreHan);
	}
	return Error;
}
bool CNetClient::SendMsg(char * pData,unsigned long DataLength)
{		
		//未调用初始化函数
		if(!IsStart || pData==NULL || DataLength==0)return false;
		//构造消息
		MSG_NODE Msg;
		Msg.DataLength=DataLength;
		memcpy(Msg.pData,pData,DataLength);
		//插入消息队列
		::EnterCriticalSection(&SendMsgQueSection);
		if(SendMsgQueue.IsEmpty())
		{
			SendMsgQueue.EnQueue(Msg);
			::LeaveCriticalSection(&SendMsgQueSection);
			//如果消息队列为空,告诉等待的发送线程可以发送了
			SetEvent(hSendEvent);
		}
		else
		{
			SendMsgQueue.EnQueue(Msg);
			::LeaveCriticalSection(&SendMsgQueSection);
		}
		return true;
}
void CNetClient::WriteLogString(LPCTSTR strLog)
{
	SYSTEMTIME sysTm;
	::GetLocalTime(&sysTm);
	//ofstream       OutputFile;
	//OutputFile.open( "NetClientLog.txt" ,ios::app);
	//OutputFile<<sysTm.wYear<<"年"<<sysTm.wMonth<<"月"<<sysTm.wDay<<"日"<<sysTm.wHour<<"时"<<sysTm.wMinute<<"分"<<sysTm.wSecond<<"秒"<<":"<<"    "<<strLog<<"\n"<<endl;
	//OutputFile.close();
}
/********************************************************************
函数名  : Queue<T>::~Queue() 
输入参数:
输出参数:
功能描述: 队列析构函灵敏,清空所有队列元素
全局变量: 无
调用模块: 
附加说明: 
********************************************************************/
template <class T>  Queue<T>::~Queue()
{
	QueueNode<T> *p=front;
	while(front!=NULL)
	{
		p=front;
		front=front->link;
		delete p;
	}
}
/********************************************************************
函数名  : Queue<T>::EnQueue
输入参数:
const T & item :要插入的结点的引用
输出参数:
功能描述: 在队列中插入一个结点
全局变量: 无
调用模块: 
附加说明: 
********************************************************************/
template <class T> void Queue<T>::EnQueue(const T & item)
{
	if(front==NULL)front=rear=new QueueNode<T>(item,NULL);
	else rear=rear->link=new QueueNode<T>(item,NULL);
}
/********************************************************************
函数名  : Queue<T>::DeQueue() 
输入参数:
T  :返回被删除结点的值
输出参数:
功能描述: 从队列中取出一个结点,并返回该结点的值
全局变量: 无
调用模块: 
附加说明: 
********************************************************************/
template <class T> T Queue<T>::DeQueue()
{
	T  retvalue;
	memset(&retvalue,0,sizeof(T));
	if(IsEmpty())
		return retvalue;
	QueueNode<T> * p=front;
	retvalue=p->data;
	front=front->link;
	delete p;
	return retvalue;
}
/********************************************************************
函数名  : Queue<T>::MakeEmpty() 
输入参数:
输出参数:
功能描述: 将队列元素清空
全局变量: 无
调用模块: 
附加说明: 
********************************************************************/
template <class T> void Queue<T>::MakeEmpty()
{
	if(front==NULL)return ;
	QueueNode<T> * p=front;
	while(front!=NULL)
	{
		p=front;
		front=front->link;
		delete p;
	}
	front=rear=NULL;
}
/*************************************************************************/
CClientSocket::CClientSocket()
{

}			
CClientSocket::~CClientSocket()
{
}
void CClientSocket::UnInit()
{
	ShutDownSocket();
	CloseSocekt();
	if(m_hExitEvent != (WSAEVENT)0xcccccccc)WSACloseEvent(m_hExitEvent);
}
bool CClientSocket::CreateSocket(SOCKET *pNewSocket,int iSockType)
{
	m_hExitEvent=WSACreateEvent();
	WSAResetEvent(m_hExitEvent);
	
	return ((*pNewSocket=WSASocket(AF_INET,iSockType,0,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)?
		false:true;
}
bool CClientSocket::BindSocket(SOCKET BindSocket,char *szHostAddr,unsigned short iHostPort)
{
	struct sockaddr_in inAddr;
	inAddr.sin_addr.S_un.S_addr=inet_addr(szHostAddr);
	inAddr.sin_family=AF_INET;
	inAddr.sin_port=htons(iHostPort);
	return (bind(BindSocket,(PSOCKADDR)&inAddr,sizeof(inAddr)))
		==SOCKET_ERROR?false:true;
}
bool CClientSocket::ShutDownSocket(SOCKET nowSocket)
{
	return shutdown(nowSocket,SD_BOTH)?false:true;
}
bool CClientSocket::CloseSocket(SOCKET nowSocket)
{
	return (closesocket(nowSocket)==SOCKET_ERROR)?false:true;
}
bool CClientSocket::SendData(SOCKET socket,char *data,DWORD len,DWORD *retlen,WSAEVENT hSendEvent,DWORD time)
{
	WSABUF DataBuf;
	WSAEVENT hEvents[2];
	WSAOVERLAPPED SendOverLapp;
	DWORD flag;

	hEvents[0]=m_hExitEvent;
	hEvents[1]=hSendEvent;
	DataBuf.buf=data;
	DataBuf.len=len;
	memset(&SendOverLapp,0,sizeof(WSAOVERLAPPED));
	SendOverLapp.hEvent=hSendEvent;
	flag=0;
	/////////////////////////////////////
	int ret;
	if((ret=WSASend(socket,&DataBuf,1,retlen,flag,&SendOverLapp,NULL))==0)
		return true;
	else if((ret==SOCKET_ERROR)&&(WSAGetLastError()==WSA_IO_PENDING))
	{
		DWORD EventCaused=WSAWaitForMultipleEvents(2,hEvents,FALSE,time,FALSE);
		WSAResetEvent(hSendEvent);
		if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0)
		{
			if(EventCaused == WAIT_OBJECT_0)
				SetLastError(CLIENT_FUNERROR);
			return false;
		}
		flag=0;
		return WSAGetOverlappedResult(socket,&SendOverLapp,retlen,false,&flag)?
			true:false;
	}
	else
		return false;
}
bool CClientSocket::RecvData(SOCKET socket,char *data,DWORD len,DWORD *retlen,WSAEVENT hRecvEvent,DWORD time)
{
	WSABUF DataBuf;
	WSAEVENT hEvents[2];
	WSAOVERLAPPED RecvOverLapp;
	DWORD flag;

	hEvents[0]=m_hExitEvent;
	hEvents[1]=hRecvEvent;
	DataBuf.buf=data;
	DataBuf.len=len;
	memset(&RecvOverLapp,0,sizeof(WSAOVERLAPPED));
	RecvOverLapp.hEvent=hRecvEvent;
	flag=0;
	/////////////////////////////////////
	int ret;
	if((ret=WSARecv(socket,&DataBuf,1,retlen,&flag,&RecvOverLapp,NULL))==0)
		return true;
	else if((ret==SOCKET_ERROR)&&(WSAGetLastError()==WSA_IO_PENDING))
	{ 
		DWORD EventCaused=WSAWaitForMultipleEvents(2,hEvents,false,time,false);
		WSAResetEvent(hRecvEvent);
		if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0)
		{
			if(EventCaused == WAIT_OBJECT_0)
				SetLastError(CLIENT_FUNERROR);
			return false;
		}
		flag=0;
		return WSAGetOverlappedResult(socket,&RecvOverLapp,retlen,false,&flag)?
			true:false;
	}
	else
		return false;
}
bool CClientSocket::SendDataS(SOCKET socket,char *data,DWORD len,DWORD *retlen,WSAEVENT hSendEvent,DWORD time)
{
	DWORD left,idx,thisret;
	left=len;
	idx=0;
	int oflag=0;
	while(left>0)
	{
		if(!SendData(socket,&data[idx],left,&thisret,hSendEvent,time))
		{
			*retlen=0;
			return false;
		}
		WSAResetEvent(hSendEvent);
		left-=thisret;
		idx+=thisret;
		if(thisret==0)
		{
			oflag++;
			if(oflag>5)
				break;
		}
	}
	*retlen=idx;
	return (idx==len)?true:false;
}
bool CClientSocket::RecvDataS(SOCKET socket,char *data,DWORD len,DWORD *retlen,WSAEVENT hRecvEvent,DWORD time)
{
	DWORD left,idx,thisret;
	left=len;
	idx=0;
	int oflag=0;
	while(left>0)
	{
		if(!RecvData(socket,&data[idx],left,&thisret,hRecvEvent,time))
		{
			*retlen=0;
			return false;
		}
		WSAResetEvent(hRecvEvent);
		left-=thisret;
		idx+=thisret;
		if(thisret==0)
		{
			oflag++;
			if(oflag>5)
				break;
		}
	}
	*retlen=idx;
	return (idx==len)?true:false;
}
bool CClientSocket::SendMsg(char * data,DWORD len,DWORD *retlen,DWORD time)
{
	WSAEVENT hEvent=WSACreateEvent();
	bool bSend=SendDataS(m_Socket,data,len,retlen,hEvent,time);
	WSACloseEvent(hEvent);
	return bSend;
}
bool CClientSocket::RecvMsg(char * data,DWORD len,DWORD *retlen,DWORD time)
{	
	WSAEVENT hEvent=WSACreateEvent();
	bool Recv=RecvData(m_Socket,data,len,retlen,hEvent,time);
	WSACloseEvent(hEvent);
	return Recv;
}
bool CClientSocket::ConnectSocket(char * szDestAddr,unsigned short iDestPort)
{
	struct sockaddr_in inAddr;
	inAddr.sin_family=AF_INET;
	inAddr.sin_port=htons(iDestPort);
	inAddr.sin_addr.S_un.S_addr=inet_addr(szDestAddr);
	return (connect(m_Socket,(PSOCKADDR)&inAddr,sizeof(inAddr)))
		    ==SOCKET_ERROR ? false:true;
}

⌨️ 快捷键说明

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