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

📄 simpleudp.cpp

📁 在linux下基于UDP通讯的程序,包括客户端与服务端.
💻 CPP
字号:
#include "SimpleUDP.h"
#include <iostream>
using namespace std;
/**
*  @desp   构造函数
*  @param  -[in,out] 无
*  @return  
*  @version  5/23/2007  duanjigang  Initial Version.
*/
CSimpleUDP::CSimpleUDP()
{
	memset(m_szBuff, 0, SOCK_BUFFER_SIZE);
}

CSimpleUDP::~CSimpleUDP()
{
	Terminate();
}

/**
*  @desp   初始化一个发送使用的套接字
*  @param  -[in,out] const char*szDstIP 要发送消息的目的地IP
*                    const int nDstPort 要发送消息的目的地端口
*  @return  成功返回TRUE,失败返回FALSE
*  @version  5/23/2007  duanjigang  Initial Version.
*/
bool CSimpleUDP::InitSendSock(const char *szDstIP, const int nDstPort)
{
	//一开始将这个描述符初始化为无效的套接字描述符
	m_nSock = INVALID_SOCKET_FD; 
#ifdef _WIN32
	int a1, a2, a3, a4;
#endif
	bool bRet = true;
	do
	{
		//进行参数检查
		if(!szDstIP || nDstPort <= 0)
		{
			cout << "error paramater" << endl;
			bRet = false;
			break;
		}
		//windows下需要初始化网络连接
		InitNetWork();
		//创建套接字
		if((m_nSock = socket(AF_INET, SOCK_DGRAM, 0)) <= 0)  
		{ 
			cout << "socket error" << endl;
			bRet = false;
			break;
		}
		
		memset((void *)&m_addr, '\0', sizeof(struct sockaddr_in));    
		//绑定端口和IP地址
		m_addr.sin_family = AF_INET; 
		m_addr.sin_port = htons((u_short)nDstPort); 
#ifdef  _WIN32
		sscanf(szDstIP, "%d.%d.%d.%d", &a1, &a2, &a3, &a4);
		m_addr.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
		m_addr.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
		m_addr.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
		m_addr.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;
#else
		if(inet_aton(szDstIP, &(m_addr.sin_addr)) < 0) 
		{ 
			CLOSE(m_nSock);
			m_nSock = INVALID_SOCKET_FD;
			bRet = false;
			break;
		} 
#endif
	}
	while(false);
    return bRet;
}

/**
*  @desp   初始化一个接收消息使用的套接字
*  @param  -[in,out] const int nRcvPort UDP接收消息的端口
*  @return  成功返回TRUE,失败返回FALSE
*  @version  5/23/2007  duanjigang  Initial Version.
*/
bool CSimpleUDP::InitRcvSock(const int nRcvPort)
{
	int sockfd; 
    bool bRet = true;
	struct sockaddr_in addr;
	
	do {
		//创建套接字描述符
        if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
        { 
			bRet = false;
			break;
        } 

        //绑定IP地址和端口
        memset((void*)&addr, '\0', sizeof(struct sockaddr_in) );
        addr.sin_family = AF_INET; 
		addr.sin_addr.s_addr = htons(INADDR_ANY);
        addr.sin_port = htons((u_short )nRcvPort);
        //进行绑定
		if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) 
        { 
			bRet = false;
			break;
		} 
	}while(false);
	
	//赋值套接字描述符的值
	m_nSock = sockfd;
	return bRet;
}


/**
*  @desp   发送消息给目的主机
*  @param  -[in,out] const char *szMsg 发送时存储消息的缓冲区
*                    const int nLength 要发送的数据的字节数
*  @return  返回发送的字节数
*  @version  5/23/2007  duanjigang  Initial Version.
*/
int CSimpleUDP::SendMsg(const char *szMsg, const int nLength)
{
	int nRet = 0;

	if(nLength <= 0 || !szMsg)
	{
		return nRet;
	}
	else
	{
			int len = sizeof(struct sockaddr_in);
			nRet = sendto(m_nSock, szMsg, strlen(szMsg), 0, (struct sockaddr*)&m_addr, len); 
	}
	return nRet;
}

/**
*  @desp   从指定UDP端口接收数据
*  @param  -[in,out] int & nSize         用来返回独到的字节数
*                    sockaddr_in & addr  存储发送消息的主机的信
*                    char* szBuff        存储消息的缓冲
*  @return  返回一个字符串指针,指向读到的消息缓冲的首地址
*  @version  5/23/2007  duanjigang  Initial Version.
*/
char * CSimpleUDP::RcvMsg(int & nSize, sockaddr_in & addr, char* szBuff)
{
	nSize = 0;
#ifdef _WIN32
	int ll(0);
#else
	socklen_t ll;
#endif 
	do
	{   
		//检查参数有效性
		if(szBuff == NULL)
		{
			return NULL;
		}

		memset(m_szBuff, '\0', SOCK_BUFFER_SIZE);
		
		//检查套接字描述符
		if(m_nSock == INVALID_SOCKET_FD)
		{
			nSize = 0;
			break;
		}
		ll = sizeof(struct sockaddr_in);   
		
		//接收消息
		nSize = recvfrom(m_nSock, m_szBuff, SOCK_BUFFER_SIZE, 0, (struct sockaddr*)&addr, &ll);          
		
		//将读到的数据拷贝至缓冲区
		memcpy(szBuff, m_szBuff, strlen(m_szBuff));
	}while(false);

	return szBuff;
}
/**
*  @desp   结束网络连接
*  @param  -[in,out] 无
*  @return  返回一个字符串指针,指向读到的消息缓冲的首地址
*  @version  5/23/2007  duanjigang  Initial Version.
*/
void CSimpleUDP::Terminate()
{
	if(m_nSock != INVALID_SOCKET_FD)
	{
		CLOSE(m_nSock);
		m_nSock = INVALID_SOCKET_FD;
	}	
}

⌨️ 快捷键说明

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