关于接受udp包的问题?

blzgotop 2005-05-17 11:40:54
这个是接收udp的部分代码,我怎么看不明白!
帖出来,让大家帮帮忙!
#include "stdafx.h"
#include "GKManager.h"
#include "ChargeThread.h"

#include "option_const.h"
#include <AuxFunction.h>

#include "GKManagerDlg.h"
#include <winsock.h>

//////////////////////////////////////////////////////////////////////////

CHAR * AllocBuffer(const CString & strMsg)
{
int nLen = strMsg.GetLength();
CHAR *pBuffer = new CHAR[nLen+1];

strcpy(pBuffer,(LPCTSTR)strMsg);

ASSERT(pBuffer != NULL);
return pBuffer; //?是否建立buffer,用来存放消息
}

//////////////////////////////////////////////////////////////////////////


ChargeThread::ChargeThread(CGKManagerDlg * _pDlg,
UINT _callbackMessage,
const PString & _gkName,
WORD _gkPort)
: PThread(1000, NoAutoDeleteThread), m_Socket()
{
m_pDlg = _pDlg;
m_uCallbackMessage = _callbackMessage;
m_sGkName = _gkName;
m_iGkPort = _gkPort;

Resume();
}

ChargeThread::~ChargeThread()
{
Close();
}

void ChargeThread::Close(void)
{
PWaitAndSignal lock(m_Mutex);
if (m_Socket.IsOpen())
m_Socket.Close();
}

void ChargeThread::Main(void)
{
TRACE("ChargeThread started.\n");

PIPSocket::Address gkip;
if (PIPSocket::GetHostAddress(m_sGkName, gkip))
{
m_Socket.SetReadTimeout(PTimeInterval(10000)); //连接的时间最好长一点
m_Socket.SetPort(m_iGkPort);
m_Socket.Connect(gkip);
}

if (m_Socket.IsOpen())
{
OnGKConnectionEstablished();

m_Socket.SetReadTimeout(PTimeInterval(1000)); //注意间隔的选取
m_Socket.SetWriteTimeout(PTimeInterval(500));

AuthenticateUser();
RefreshEpsAndCalls();

//PString rdbuf;
//rdbuf.SetSize(10000); // 10K数据

while (m_Socket.IsOpen())
{
PString rdbuf;
int iResult = m_Socket.Read(rdbuf.GetPointer(10000), 10000); //10K数据
rdbuf.SetSize(m_Socket.GetLastReadCount() + 1);

//int iResult = m_Socket.Read(rdbuf.GetPointer(), rdbuf.GetSize());
//rdbuf.SetSize(m_Socket.GetLastReadCount() + 1);
if (!iResult)
{
TRACE("ChargeThread Read error: %i --- %s\n" ,
m_Socket.GetErrorNumber(), (LPCTSTR)m_Socket.GetErrorText());
PChannel::Errors err = m_Socket.GetErrorCode();
if (err == PChannel::Miscellaneous) //连接断开。
break;
continue;
}

//字符串长度不能超过512个字节,否则trace会出错!
//TRACE("收到数据:%d\t%s\n", m_Socket.GetLastReadCount(), (LPCTSTR)rdbuf);
DealWithGKStatusString(rdbuf);
}

OnGKConnectionCleared();
}
else
{
TRACE("Bind to ChargeThread listener failed!\n");
OnGKConnectFailed();
}

TRACE("ChargeThread ended.\n");
}

//////////////////////////////////////////////////////////////////////////
void ChargeThread::RefreshEpsAndCalls(void)
{
WriteStringToNet("PrintAllRegistrations\r\n");
WriteStringToNet("PrintCurrentCalls\r\n");
}

BOOL ChargeThread::WriteStringToNet(const PString &_str)
{
PWaitAndSignal lock(m_Mutex);

BOOL result;
if (m_Socket.IsOpen() )
result = m_Socket.WriteString(_str); // 是否调用 write()?
else
result = FALSE;

return result;
}

BOOL ChargeThread::ReadStringFromNet(void * _buf, PINDEX & _len)
{
if(!m_Socket.IsOpen())
return FALSE;

return m_Socket.Read(_buf, _len);
}

//////////////////////////////////////////////////////////////////////////

VOID ChargeThread::AuthenticateUser()
{
while(m_Socket.IsOpen())
{
PString rdbuf;
int iResult = m_Socket.Read(rdbuf.GetPointer(10000), 10000); //1K数据
rdbuf.SetSize(m_Socket.GetLastReadCount() + 1);
if (!iResult)
{
TRACE("ChargeThread Read error: %i --- %s\n" ,
m_Socket.GetErrorNumber(), (LPCTSTR)m_Socket.GetErrorText());
PChannel::Errors err = m_Socket.GetErrorCode();
if (err == PChannel::Miscellaneous) //连接断开
break;
continue;
}

//字符串长度不能超过512个字节,否则trace会出错!
//TRACE("收到数据:%d\t%s\n", m_Socket.GetLastReadCount(), (LPCTSTR)rdbuf);

BOOL bLogin = FALSE, bPassword = FALSE;
bLogin = (rdbuf.Find("login") != P_MAX_INDEX);
bPassword = (rdbuf.Find("Password") != P_MAX_INDEX);
if(!bLogin && !bPassword)
{
if (m_pDlg != NULL) //认证通过
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage, (WPARAM)5, NULL);
DealWithGKStatusString(rdbuf);
break;
}

if (bLogin && (m_pDlg != NULL)) //开始认证(注意下面发消息的技巧)
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage+1, (WPARAM)0, NULL);
else
{
PConfig config(PConfig::Application, (LPCTSTR)LoadStringFromResource(IDS_APP_NAME),
(LPCTSTR)LoadStringFromResource(IDS_MANU_NAME));
PString password = (LPCTSTR)config.GetString(KEY_PASSWORD, DEFAULT_PASSWORD);
WriteStringToNet(password + "\r\n");
}
}
}

VOID ChargeThread::DealWithGKStatusString(const PString & _str)//send message
{
if (m_pDlg != NULL)
//m_pDlg->DealWithGKStatusString(_str);
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage, (WPARAM)6, (LPARAM)AllocBuffer((const char*)_str));
}


//////////////////////////////////////////////////////////////////////////


void ChargeThread::OnGKConnectFailed()
{
if (m_pDlg != NULL)
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage, (WPARAM)0, NULL);
}

void ChargeThread::OnGKConnectionEstablished()
{
if (m_pDlg != NULL)
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage, (WPARAM)1, NULL);
}

void ChargeThread::OnGKConnectionCleared()
{
if (m_pDlg != NULL)
::PostMessage(m_pDlg->m_hWnd, m_uCallbackMessage, (WPARAM)2, NULL);
}

//////////////////////////////////////////////////////////////////////////

...全文
72 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
microgiant 2005-05-17
  • 打赏
  • 举报
回复
你想说明一个什么问题?太抽象了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧