教程 | 無連接套接字類CxUdpSocket


CxUdpSocket的使用如下(以某個叫做CSomeClass的類的相關代碼為例):

一、聲明無連接套接字對象實例。

CxUdpSocket m_usRemoteHost;

二、設置無連接套接字事件通知方式。消息響應或回調函數,任選其一。無連接套接字事件有:緩沖區有數據可接收。

void CSomeClass::PreSubclassWindow() 
{
    // TODO: Add your specialized code here and/or call the base class
    HWND hwnd = GetSafeHwnd();
    MSG msg = {hwnd, WM_SOCKET_EVENT};
    m_usRemoteHost.SetWindowMessage(&msg);
    m_csRemoteHost.SetWindowMessage(&msg);
    m_ssLocalHost.SetWindowMessage(&msg);

    if (m_btCSMode == CSM_SERVER)
        ListenRemoteHost();

    CStatic::PreSubclassWindow();
}

三、綁定無連接套接字

BOOL CSomeClass::BindToLocalHost()
{
    if (m_usRemoteHost.IsBinded())
        m_usRemoteHost.Disbind();
        
    BOOL bRet = m_usRemoteHost.Bind(m_nUdpPort);

    CString str;
    if (!bRet)
        str.Format("Bind to %d failed. err code [%d].\n", m_nUdpPort,
                    CxSocket::WSAGetLastError());
    else
        str.Format("Bind to %d succeed.\n", m_nUdpPort);
    OutputDebugString(str);

    return bRet;
}

四、處理消息響應或函數回調。
1.消息響應

BEGIN_MESSAGE_MAP(CSomeClass, CStatic)
    //{{AFX_MSG_MAP(CSomeClass)
    ON_WM_DESTROY()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_SOCKET_EVENT, OnSocketEvent)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSomeClass message handlers
LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam) {
if (WSAGETSELECTERROR(lParam) != 0) return 1; int nEvent = WSAGETSELECTEVENT(lParam); switch (nEvent) {
     case FD_ACCEPT: OnSocketAccept(wParam); break;
      
case FD_CLOSE: OnSocketClose(wParam); break;
      
case FD_READ: OnSocketRead(wParam); break;
     default: break; } return 1; } void CSomeClass::OnSocketRead(WPARAM wParam) { if (m_usRemoteHost.GetSocket() == (SOCKET)wParam) { SOME_DATA_STRUCT data = {0}; char szIPAddr[MAX_IPV6] = {'\0'}; if (m_usRemoteHost.RecvFrom(szIPAddr, (LPBYTE)&data, sizeof(data))) {
    //do something with data;

     } } }

2.回調函數

LRESULT CALLBACK CSomeClass::SocketProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT lRet = 0;
    CSomeClass* pThis = (CSomeClass*)hwnd;
    if (pThis != NULL)
        lRet = pThis->OnSocketEvent(wParam, lParam);

    return lRet;
}

注意,在使用回調函數時應設置無連接套接字接收緩沖區事件通知方式為回調函數,並且設法把this指針傳入設置函數,方便在回調函數中調用成員函數。

MSG msg = {(HWND)this, WM_SOCKET_EVENT};
m_usRemoteHost.SetWindowMessage(&msg, SocketProc);

五、解綁定無連接套接字。

void CSomeClass::OnDestroy() 
{
    CStatic::OnDestroy();
    
    // TODO: Add your message handler code here
    TerminateWaitComm();

    m_csRemoteHost.DisConnect();
    m_ssLocalHost.DisListen();
    m_usRemoteHost.Disbind();
}

  至於無連接套接字數據發送,很簡單,在需要處調用以下函數:

m_usRemoteHost.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));

  精練的代碼不需要過多解釋,你們懂的。To be continued...

下載

Sample using libComm - v1.1 For WinXP

libComm - v1.2 For WinXP/Win7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM