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

📄 zudpsocket.cpp

📁 短信网管的原代码。用于与sp通信
💻 CPP
字号:
///////////////////////////////////////////////////////////////////
// ZSocket.h: interface for the CZSocket class.
// 
// 创建时间:6.8
// 功能:封装UDP Socket 通信接口
///////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ZUDPSocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DWORD WINAPI UDPRecvThread(LPVOID lpParam);


CZUDPSocket::CZUDPSocket()
{
	m_bUDPThreadEnd=TRUE;
	m_bInit=FALSE;
	m_hSocket=-1;  
	m_nPort=0;
}

CZUDPSocket::~CZUDPSocket()
{   
   CloseSocket();
}
BOOL CZUDPSocket::CloseSocket()
{
	EndRecvThread();
	closesocket(m_hSocket);	
	return TRUE;
}
//初始化客户端的SOCKET
BOOL CZUDPSocket::InitUDPSocket(int nPort,BOOL bIRecv)
{
	if(m_bInit) 
	{		
		return FALSE;
	}
	sockaddr_in SockAddr;

	m_hSocket = socket(AF_INET, SOCK_DGRAM,0);
    if (m_hSocket == INVALID_SOCKET)
    {        	
        return FALSE;
    }	

	char hostName[128];
	ZeroMemory(hostName,sizeof(hostName));
    if(gethostname(hostName,sizeof(hostName))!=0)
		return FALSE;
	hostent* he=gethostbyname(hostName);         
	u_long addr= (*(u_long FAR *) he->h_addr_list[0]);
   	
	SockAddr.sin_addr.s_addr = addr;//inet_addr(pServerIp);
	SockAddr.sin_family=AF_INET;
	SockAddr.sin_port=htons(nPort);
/*	if(SOCKET_ERROR==bind(m_hSocket, (sockaddr FAR *)&SockAddr,sizeof(SockAddr)))
		return FALSE;
   	m_bUDPThreadEnd=FALSE;
	//if(!bIRecv)
	   //CreateRecvThread(this);	*/

	char* pServerIp=inet_ntoa(SockAddr.sin_addr);
	strcpy(m_ServerIp,pServerIp);
	m_nPort=nPort;
	m_bInit=TRUE;
	return TRUE;
}
//发送消息函数	
BOOL CZUDPSocket::SendTo(char Buff[],int BufLen,char* RemoteIp,int nPort)
{
	if(!m_bInit)
		return FALSE;
	if(m_hSocket == INVALID_SOCKET) return FALSE;
		
	sockaddr_in SockAddr;
	memset(&SockAddr,0,sizeof(SockAddr));	
	SockAddr.sin_addr.s_addr = inet_addr(RemoteIp);	
	SockAddr.sin_family=AF_INET;
	SockAddr.sin_port=htons((u_short)nPort);	
	int ret,nLeft,idx;							 
	nLeft = BufLen;
	idx = 0;
	while(nLeft > 0)
	{
		ret = sendto(m_hSocket,&Buff[idx],nLeft,0,(sockaddr*)&SockAddr,sizeof(SockAddr));
		if (ret == 0)
		{
			return FALSE;		
		}else if(ret== SOCKET_ERROR)
		{
			return FALSE;
		}
		nLeft -= ret;
		idx += ret;
	}		
	return TRUE;
}
//接收消息函数
int CZUDPSocket::ReceiveFrom(char Buff[],int BufLen,char* SourceIp,int* nPort)
{	
	sockaddr_in addr;	
	int structlen=sizeof(sockaddr_in);
	int returnvalue=recvfrom(m_hSocket,Buff,BufLen,0,(sockaddr*)&addr,&structlen);
	strcpy(SourceIp,inet_ntoa(addr.sin_addr));
	*nPort=ntohs(addr.sin_port);
	return returnvalue;
}
//接收消息函数
BOOL CZUDPSocket::ReceiveMsg(char Buff[],int BufLen,char* SourceIp,int nPort)
{
	return TRUE;
}
//创建接收线程函数
void CZUDPSocket::CreateRecvThread(CZUDPSocket* pZSocket)
{
	if(pZSocket==NULL) return;
	if(pZSocket->m_hSocket==INVALID_SOCKET) return;
	m_bUDPThreadEnd=FALSE;
	DWORD dwThreadId;
	HANDLE hThread = CreateThread(NULL, 0, UDPRecvThread, 
		                   pZSocket, 0, &dwThreadId);	
	if(hThread==NULL)
		MessageBox(NULL,"创建接收线程失败!","错误提示",0);
    return ;
}
//结束接收线程函数
void CZUDPSocket::EndRecvThread()
{
	m_bUDPThreadEnd=TRUE;
}

DWORD WINAPI UDPRecvThread(LPVOID lpParam)
{
	CZUDPSocket* pSocket=(CZUDPSocket*)lpParam;
	if(pSocket==NULL) return 0;
	if(pSocket->m_hSocket==INVALID_SOCKET) return 0;
	char          buff[5120];
    int           ret,structlen;
	int			  codeID=0;
	int			  MsgBodyLength=0;	
	sockaddr_in addr;	
	char* SourceIp;		
	while(!pSocket->m_bUDPThreadEnd)
	{		
    	ZeroMemory(buff,5120);
		ZeroMemory(&addr,sizeof(sockaddr_in));  
		structlen=sizeof(sockaddr_in);
		ret=recvfrom(pSocket->m_hSocket,buff,5120,0,(sockaddr *)&addr,&structlen);
	    SourceIp=inet_ntoa(addr.sin_addr);
        if ((ret == SOCKET_ERROR)||(ret<=0))
		{    
		    return SOCKET_ERROR;
		}
		pSocket->ReceiveMsg(buff,ret,SourceIp,ntohs(addr.sin_port));		
	}	
	return 0;
}

⌨️ 快捷键说明

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