建一对话框IDD_Addr,用来输入IP地址和Port;增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。
Control ID Type Member IDC_Addr CString m_Addr IDC_Port Int m_Port 在CSockClientDlg.ccp中添加代码: #include "AddrDlg.h" protected: int TryCount; MySock m_clientSocket; UINT m_szPort; public: char m_szServerAdr[256]; |
双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:
m_clientSocket.ShutDown(2); m_clientSocket.m_hSocket=INVALID_SOCKET; m_clientSocket.m_bConnected=FALSE; CAddrDlg m_Dlg; m_Dlg.m_Port=1088;//默认端口1088 if (m_Dlg.DoModal()==IDOK && !m_Dlg.m_Addr.IsEmpty()) { memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr)); m_szPort=m_Dlg.m_Port; SetTimer(1,1000,NULL);//建立计时器,每1秒尝试连接一次 TryCount=0; } |
添加Windows消息WM_TIMER响应函数OnTimer
void CCSockClientDlg::OnTimer(UINT nIDEvent) { if (m_clientSocket.m_hSocket==INVALID_SOCKET) { BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT); if(!bFlag) { AfxMessageBox("Socket Error!"); m_clientSocket.Close(); PostQuitMessage(0); return; } } m_clientSocket.Connect(m_szServerAdr,m_szPort); TryCount++; if (TryCount >=10 || m_clientSocket.m_bConnected) { KillTimer(1); if (TryCount >=10) AfxMessageBox("Connect Failed!"); return; } CDialog::OnTimer(nIDEvent); } |
双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:
void CCSockClientDlg::OnSend() { if (m_clientSocket.m_bConnected) { m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer)); m_clientSocket.AsyncSelect(FD_WRITE); m_MSG.SetWindowText(""); } }
双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:
void CCSockClientDlg::OnExit() { m_clientSocket.ShutDown(2); //关闭Socket EndDialog(0); } |
运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。
|