设为首页 加入收藏

TOP

利用CAsyncSocket类实现Socket编程(二)
2012-11-04 15:17:01 来源: 作者: 【 】 浏览:491
Tags:利用 CAsyncSocket 实现 Socket 编程
  建一对话框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类会自动处理。

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用VC++开发数据库应用程序(五) 下一篇用VC++开发数据库应用程序(四)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: