科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用CAsyncSocket类实现Socket编程

利用CAsyncSocket类实现Socket编程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

VC 的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现Socket编程,是非常方便的。

作者:佚名 来源:常州vc网 2007年10月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
服务端

  Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:

CNewSocket::OnReceive(int nErrorCOde)
{
 m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
 AsyncSelect(FD_WRITE);}// 直接转发消息
 CNewSocket::OnSend(int nErrorCode)
 {
  Send(m_szBuffer,m_nLength,0);
 }
}

  建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下:

  在MyServerSocket.h中声明变量

public::
CNewSocket* m_pSocket;
void CMyServerSocket::OnAccept(int nErrorCode)
{
 CNewSocket* pSocket = new CNewSocket();
 if (Accept(*pSocket))
 {
  pSocket- >AsyncSelect(FD_READ);
  m_pSocket=pSocket;
 }else
  delete pSocket;
}

  为对话框添加一个“侦听”按钮,添加如下代码:

  在CsockServerDlg.ccp中声明变量

public:
 CMyServerSocket m_srvrSocket;
 void CCSockServerDlg::OnListen()
 { if (m_srvrSocket.m_hSocket==INVALID_SOCKET)
 { BOOL bFlag=m_srvrSocket.Create(UserPort,SOCK_STREAM,FD_ACCEPT);
  if (!bFlag)
  {
   AfxMessageBox(“Socket Error!”);
   M_srvrSocket.Close();
   PostQuitMessage(0);
   Return;
   }
  }

 if (!m_srvrSocket。Listen(1))
 {
  int nErrorCode = m_srvrSocket.GetLastError();
  if (nError!=WSAEWOULDBLOCK)
  {
   AfxMessageBox(“Socket Error!”);
   M_srvrSocket.Close();
   PostQuitMessage(0);
   Return;
   }
 }
}

  CAsyncSocket类为我们使用Socket提供了极大方便。建立Socket的WSAStartup过程和bind过程被简化成为Create过程,IP地址类型转换、主机名和IP地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作,特别是CAsyncSocket类的异步特点,完全可以替代繁琐的线程操作。MFC提供了大量的类库,我们若能灵活的使用他们,便会大大提高编程的效率。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章