1.重載CAsyncSocket
class CUDPSocket : public CAsyncSocket { public: CUDPSocket(); virtual ~CUDPSocket(); void SetParent(CDialog* pWnd); private: CDialog* m_pWnd; virtual void OnClose(int nErrorCode); virtual void OnReceive(int nErrorCode); virtual void OnSend(int nErrorCode); };
2.通訊過程:
Server | Client |
Create: m_ServerPort:指定本機的端口; SOCK_DGRAM:UDP通訊方式。 |
m_ClientPort:指定本機的端口; SOCK_DGRAM:UDP通訊方式。 |
Create(m_ServerPort,SOCK_DGRAM); |
Create(m_ClientPort,SOCK_DGRAM); |
Send: m_Message:指定發送信息(注意該結構體內不應含有變長數據類型,如CString) m_ClientPort:信息接受端的端口號 m_strClientIP:信息接收端的IP地址 |
m_Message:指定發送信息(注意該結構體內不應含有變長數據類型,如CString) m_ServerPort:信息接受端的端口號 m_strServerIP:信息接收端的IP地址 |
int iSent = m_sDataSocket.SendTo(&m_Message,sizeof(MSGSTRUCT), m_ClientPort, m_strClientIP.GetBuffer(m_strClientIP.GetLength()+1)); |
Send: int iSent = m_sDataSocket.SendTo(&m_Message,sizeof(MSGSTRUCT), m_ServerPort, m_strServerIP.GetBuffer(m_strServerIP.GetLength()+1)); |
Receive: m_Message:用來接受數據的緩存區 rSocketAddress:信息來源的IP地址 rSocketPort:信息來源的端口號 |
m_Message:用來接受數據的緩存區 rSocketAddress:信息來源的IP地址 rSocketPort:信息來源的端口號 |
CString rSocketAddress; |
CString rSocketAddress; |
3.具體連接步驟:
(1)Server、Client分別建立自己的連接Create;
(2)Client事先知道Server的Port和IP地址;Client向Server發送消息SendTo
(3)Server接受到來自某個UDP的連接(在這里為Client),獲得來源Client的IP和Port;
(4)Server向來源Client發送消息。
4.小結
用CAsyncSocket 做UDP通信方式,理解起來很簡單。實現起來花了點功夫。找到的資料大多是TCP通訊方式的。
5.參考資料
http://support.microsoft.com/kb/214396/
http://www.codeproject.com/Articles/16581/Sending-Receiving-UDP-Datagrams-with-MFC-s-CAsyncS