阿嵩 唉唷

關於部落格
  • 190330

    累積人氣

  • 1

    今日人氣

    0

    訂閱人氣

WSAAsyncSelect with MFC

在一般的使用當中,就是用CreateWindow開起一個Window procedure,或是一個dialog box,但是使用Visual studio來建立MFC上就不需要這麼做了

我們可以直接在建立socket之後就使用WSAAsyncSelect來開啟訊息通知的功能

int WSAAsyncSelect(
    __in  SOCKET s,
    __in  HWND hWnd,
    __in  unsigned int wMsg,
    __in  long lEvent
);

s是我們想要注意他的動態的socket
hWnd是當有訊息產生時要通知哪一個視窗
wMsg通知的訊息內容
lEvent你有興趣的型態
lEvent的值 意義
FD_READ  當有資料到socket中可以讀取的通知
FD_WRITE  當有資料準備送出的通知
FD_OOB  Wants to receive notification of the arrival of OOB data.
FD_ACCEPT  accept時的通知
FD_CONNECT  完成connect的通知
FD_CLOSE  socket關閉的通知
FD_QOS  Wants to receive notification of socket Quality of Service (QOS) changes.
FD_GROUP_QOS  Wants to receive notification of socket group Quality of Service (QOS) changes (reserved for future use with socket groups). Reserved.
FD_ROUTING_INTERFACE_CHANGE  Wants to receive notification of routing interface changes for the specified destination(s).
FD_ADDRESS_LIST_CHANGE  Wants to receive notification of local address list changes for the socket protocol family.

如果成功的話,會return 0,失敗則會return SOCKET_ERROR

呼叫的範例如下:
#define WM_SOCKET  WM_USER +1
如果需要很多種訊息的話 可以自己定義
if((WSAAsyncSelect(ServSock, this->m_hWnd, WM_SOCKET, FD_READ|FD_WRITE))==SOCKET_ERROR){
AfxMessageBox(_T("WSAAsyncSelect error"));
           return ;
}

當要得到很多種消息的話要用 「 |
如果要取消這個訊息的話就用WSAAsyncSelect(ServSock, this->m_hWnd, 0,0);

接著是要用來處理這個訊息的函式
在header中宣告
afx_msg LRESULT OnSocketEvent(WPARAM   wparam,LPARAM   lparam);

cpp裡面就寫
LRESULT CSimRTPDlg::OnSocketEvent(WPARAM   wparam,LPARAM   lparam){}

最後在BEGIN_MESSAGE_MAP中加入這一行
ON_MESSAGE(WM_SOCKET,&CSimRTPDlg::OnSocketEvent)
當然用來處理訊息的函式可以改名字啦,只是其他部份要作對應 

處理訊息的時候,就這樣用吧,用switch+case來找到

switch (LOWORD(lparam)){  
    case FD_READ:

  m_pUDPSocket->Receive();

  break;

}



reference:
http://msdn2.microsoft.com/en-us/library/ms741540.aspx
http://www.sinzy.net/Blog/Read.asp?ID=44&BID=2194
相簿設定
標籤設定
相簿狀態