利用CAsyncSocket类实现UDP通信

Eddy 发布于2010-8-23 10:38:24 分类: 程序设计 已浏览loading 网友评论0条 我要评论

服务端:

void CServerDlg::OnSend()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 if (m_sockSend.Create(m_ServerPort,SOCK_DGRAM)) //创建套接字
 {
  m_sockSend.Bind(m_ServerPort,m_ServerIP); //绑定本地套接口
  SetTimer(1,3000,NULL); //创建一个定时器定时发送
  GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
  GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
 }
 else
 {
  AfxMessageBox("Socket创建失败!");
 }
}

//其中,m_sockSend为CAsyncSocket对象,在对话框类头文件中声明。

void CServerDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 static int iIndex=0; //计数
 char szSend[20]; //发送数据缓冲区
 sprintf(szSend,"%010d",iIndex++);
 int iSend = m_sockSend.SendTo(szSend,10,m_ClientPort,m_ClientIP,0);//发送UDP数据

 m_strSend=szSend; //当前发送数据
 m_sendcount+=iSend; //记录发送字节数
 UpdateData(FALSE);
 CDialog::OnTimer(nIDEvent);
}

void CServerDlg::OnStop()
{
 // TODO: Add your control notification handler code here
 KillTimer(1); //关闭定时器
 m_sockSend.Close(); //关闭套接字
 GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
}

客户端:

void CServerDlg::OnReceive()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 if (m_sockReceive.Create(m_ClientPort,SOCK_DGRAM,NULL)) //创建套接字
 {
  m_sockReceive.Bind(m_ClientPort,m_ClientIP); //绑定本地套接口
  SetTimer(1,2000,NULL); //创建一个定时器定时发送
  GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
  GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
 }
 else
 {
  AfxMessageBox("Socket创建失败!");
 }
}

void CServerDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 char szRecv[20]; //接收数据缓冲区
 int iRecv = m_sockReceive.ReceiveFrom(szRecv,10,m_ServerIP,m_ServerPort,0);//发送UDP数据

 if (iRecv==-1)
 {
  m_ReceiveData="没有收到数据!";
 }
 else
 {
  m_receivecount+=iRecv; //记录发送字节数
  szRecv[iRecv]=NULL;
  m_ReceiveData=szRecv; //当前发送数据
 }
 UpdateData(FALSE);
 CDialog::OnTimer(nIDEvent);
}

void CServerDlg::OnStop()
{
 // TODO: Add your control notification handler code here
 KillTimer(1); //关闭定时器
 m_sockReceive.Close(); //关闭套接字
 m_ReceiveData="停止接收数据!";
 UpdateData(FALSE);
 GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
}

注意:使用WinSock,需要在CWinApp类的InitInstance函数中添加WinSock初始化代码,如下所示:

 if (!AfxSocketInit()) //初始化Socket
 {
  AfxMessageBox("WinSocket初始化失败");
  return FALSE;
 }

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/program/535.html     欢迎订阅Eddy Blog

关于 CAsyncSocket  UDP  的相关文章

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言