可以,
CAsyncProxySocket::CAsyncProxySocket()
{
}CAsyncProxySocket::~CAsyncProxySocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CAsyncProxySocket, CAsyncSocket)
//{{AFX_MSG_MAP(CAsyncProxySocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0/////////////////////////////////////////////////////////////////////////////
// CAsyncProxySocket member functionsvoid CAsyncProxySocket::OnReceive(int nErrorCode) 
{
CAsyncSocket::OnReceive(nErrorCode);
if(nErrorCode != 0)
return;
char buf[BUFF_SIZE];
char* p = NULL; int num = Receive(buf, BUFF_SIZE, 0);
if(num == 0 || num == SOCKET_ERROR){
TRACE("Error in receive UDP message!\n");
return;
}
if(buf[0] == 0 && buf[1] == 0){
TRACE("Received a UDP Packets!\n");
switch(buf[2]){
case ATYP_IPV4:
p = buf + 10;
//here add your processing code....
break;
case ATYP_DOMAINNAME:
p = buf + buf[4] + 7;
//here add your processing code....
break;
case ATYP_IPV6:
p = buf + 22;
//here add your processing code....
break;
}
}
}int CAsyncProxySocket::UDPSend(char *buf, int size)
{
char* lpData = new char[size + 262];
int len = 0; memset(lpData, 0, size + 262);
lpData[2] = 0;     //不支持帧组合
in_addr sa = CProxySocket::GetIpByHost(m_strRemote.GetBuffer(0));
if(sa.s_addr != INADDR_NONE){
lpData[3] = ATYP_IPV4;
memcpy(lpData + 4, &sa, 4);
memcpy(lpData + 8, &m_nPortRemote, 2);
len = 10;
}
else{
lpData[3] = ATYP_DOMAINNAME;
len = lpData[4] = m_strRemote.GetLength();
memcpy(lpData + 5, m_strRemote.GetBuffer(0), lpData[4]);
m_strRemote.ReleaseBuffer();
memcpy(lpData + len + 5, &m_nPortRemote, 2);
len = len + 7;
}
memcpy(lpData + len, buf, size);
int num = Send(lpData, len + size);
if(num == 0 || num != (len +size)){
TRACE("Send UDP error!\n");
delete [] lpData;
return 0;
}
delete [] lpData;
return len + size;
}
具体可以见<<windows 高级网络编程>>

解决方案 »

  1.   

    可以
    CAsyncProxySocket::CAsyncProxySocket()
    {
    }CAsyncProxySocket::~CAsyncProxySocket()
    {
    }
    // Do not edit the following lines, which are needed by ClassWizard.
    #if 0
    BEGIN_MESSAGE_MAP(CAsyncProxySocket, CAsyncSocket)
    //{{AFX_MSG_MAP(CAsyncProxySocket)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    #endif // 0/////////////////////////////////////////////////////////////////////////////
    // CAsyncProxySocket member functionsvoid CAsyncProxySocket::OnReceive(int nErrorCode) 
    {
    CAsyncSocket::OnReceive(nErrorCode);
    if(nErrorCode != 0)
    return;
    char buf[BUFF_SIZE];
    char* p = NULL; int num = Receive(buf, BUFF_SIZE, 0);
    if(num == 0 || num == SOCKET_ERROR){
    TRACE("Error in receive UDP message!\n");
    return;
    }
    if(buf[0] == 0 && buf[1] == 0){
    TRACE("Received a UDP Packets!\n");
    switch(buf[2]){
    case ATYP_IPV4:
    p = buf + 10;
    //here add your processing code....
    break;
    case ATYP_DOMAINNAME:
    p = buf + buf[4] + 7;
    //here add your processing code....
    break;
    case ATYP_IPV6:
    p = buf + 22;
    //here add your processing code....
    break;
    }
    }
    }int CAsyncProxySocket::UDPSend(char *buf, int size)
    {
    char* lpData = new char[size + 262];
    int len = 0; memset(lpData, 0, size + 262);
    lpData[2] = 0;     //不支持帧组合
    in_addr sa = CProxySocket::GetIpByHost(m_strRemote.GetBuffer(0));
    if(sa.s_addr != INADDR_NONE){
    lpData[3] = ATYP_IPV4;
    memcpy(lpData + 4, &sa, 4);
    memcpy(lpData + 8, &m_nPortRemote, 2);
    len = 10;
    }
    else{
    lpData[3] = ATYP_DOMAINNAME;
    len = lpData[4] = m_strRemote.GetLength();
    memcpy(lpData + 5, m_strRemote.GetBuffer(0), lpData[4]);
    m_strRemote.ReleaseBuffer();
    memcpy(lpData + len + 5, &m_nPortRemote, 2);
    len = len + 7;
    }
    memcpy(lpData + len, buf, size);
    int num = Send(lpData, len + size);
    if(num == 0 || num != (len +size)){
    TRACE("Send UDP error!\n");
    delete [] lpData;
    return 0;
    }
    delete [] lpData;
    return len + size;
    }
    可参考《WINDOWS高级网络编程》