📄 simpleudp.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 + -