这个是接收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);
}//////////////////////////////////////////////////////////////////////////