⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用visual c++ 40 实现window.htm

📁 VC的一些技巧性文档
💻 HTM
字号:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>电子与电脑</title></head><body background="di2001.jpg"><p> </p><font size="2"><h2 align="center"></font><font size="5" color="#0000FF">用Visual C++ 4.0 实现Windows 95 Socket编程 </font></h2><div align="center"><center><table width="80%">  <tr>    <td><font size="4">作者:</font><font size="2"> </font><font size="4"><a    href="mailto:LDQ@USA.NET">李大琪</a><br>    北京市5130信箱106分箱</font><font size="2"><p>  Windows 95 Socket 提 供 了     在 Microsoft Windows 95 中 进 行 网 络 程 序 设 计 的 一 个 接 口, 它     是 在 Unix Socket 的 基 础 上 发 展 而 来 的, 不 仅 保 留 了Unix Socket     原 有 的 风 格, 而 且 还 融 入 了 适 合 于 Windows 95 的 新 特 点,     这 使 得 用 户 可 以 利 用 Windows 95 Socket API 直 接 进 行 进 程 与 应     用 程 序 间 的 通 信。Windows 95 在Internet 支 配 域 中 的TCP/IP 协 议 定     义 了 Socket 编 写 规 程, 使 用 Socket 的 目 的 是 使 用 户 在 网 络     协 议 上 工 作 而 不 必 对 该 网 络 协 议 有 非 常 深 入 的 了 解。     此 外, 这 样 编 写 的 程 序 可 被 迅 速 移 植 到 任 何 支 持 Socket     的 网 络 系 统 中 去。 </p>    <p>  Microsoft Windows Class Library( MFC ) 中 提 供 了 CSocket 类 用 来     实 现 网 络 通 信。 图 一 中 给 出 了CSocket 类 的 继 承 关 系。 </p>    <p>   下 面 将 介 绍 用Visual C++ 4.0 在Windows 95 中 实 现 Socket 的     CSocket 类 相 关 成 员 函 数( 这 些 成 员 函 数 实 际 上 是 从CAsyncSocket     类 继 承 来 的 )。 </p>    <p>  (1) BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long     lEvent = FD_READ |FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE,LPCTSTR     lpszSocketAddress = NULL ) </p>    <p>   该 函 数 用 来 建 立Socket。 其 中,nSocketPort 为 所 选 择 的     Socket 端 口, 一 般 要 大 于 1023, 如 果 该 参 数 为 0, 则 由 系 统     选 定 一 端 口, 默 认 值 为 0 ;nSocketType 为 套 接 字 类 型 :SOCK_STREAM     表 示 为 流 套 接 字, SOCK_DGRAM 表 示 为 数 据 报 套 接 字, 默 认     值 为 SOCK_STREAM ;lEvent 标 识 该 Socket 要 完 成 哪 种 工 作, 默 认     值 为FD_READ|FD_WRITE|FD_OOB| FD_ACCEPT|FD_CONNECT|FD_CLOSE ;lpszSockAddress 为 网     络 地 址 信 息 结 构 指 针, 包 含 网 络 地 址 , 默 认 值 为 NULL     。 </p>    <p>  (2)BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL ) </p>    <p>   该 函 数 的 作 用 是 将Socket 端 口 与 网 络 地 址 连 接 起     来。 参 数 含 义 同 上 。 </p>    <p>  (3)BOOL Listen( int nConnectionBacklog = 5 ) </p>    <p>   该 函 数 的 作 用 是 等 待Socket 请 求。 其 中,nConnec-tionBacklog     表 示 等 待 队 列 的 长 度, 默 认 值 为 最 大 值 5 。 </p>    <p>  (4)virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR*     lpSockAddr = NULL, int* lpSockAddrLen = NULL ) </p>    <p>   该 函 数 的 作 用 是 取 得 队 列 上 第 一 个 连 接 请 求 并     建 立 一 个 具 有 与Socket 相 同 特 性 的 套 接 字。 其 中,rConnectedSocket     表 示 一 个 新 的 Socket 。 </p>    <p>  (5)BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ) </p>    <p>   该 函 数 的 作 用 是 提 出 请 求。 其 中,lpszHostAddress 和     nHostPort 为 接 受 请 求 进 程 的 网 络 地 址 和 Socket 端 口 号 。 </p>    <p>  (6)virtual void Close( ) </p>    <p>   该 函 数 的 作 用 是 关 闭 该 Socket 。 </p>    <p>   利 用 CSocket 类 直 接 进 行 数 据 通 信 有 两 种 方 式 : 一     种 是 利 用 CSocketFile 类 和 Archive 类 去 实 现, 另 一 种 是 利 用     CSocket 的 成 员 函 数 Receive、Send、ReceiveFrom、SendTo、Listen 和 Accept 等     来 实 现( 这 些 成 员 函 数 实 际 上 也 是 从CAsyncSocket 类 继 承     的)。 </p>    <p>   两 种 方 法 的 实 现 步 骤 如 下 : </p>    <p>  Server : Construct-&gt; Creat-&gt; Bind -&gt; Listen-&gt; Accept-&gt;     Send-&gt;Close ; </p>    <p>  Cilent : Construct -&gt;Creat-&gt; Connect-&gt; Receive-&gt; Close。 </p>    <p>   下 面 我 就 用 Visual C++ 4.0 的 代 码 段 分 别 介 绍 如 何 运     用 上 述 两 种 方 法 来 实 现Socket 编 程。 </p>    <p>  1、 利 用 CSocketFile 类 和 Archive 类 实 现 </p>    <p>  (1)Server </p>    <p>  // construct a socket </p>    <p>  CSocket sockSrvr; </p>    <p>  // create the SOCKET </p>    <p>  sockSrvr.Create(nPort); </p>    <p>  // start listening </p>    <p>  sockSrvr.Listen( ); </p>    <p>  //construct a new, empty socket </p>    <p>  CSocket sockRecv; </p>    <p>  // accept connection </p>    <p>  sockSrvr.Accept( sockRecv ); </p>    <p>  // construct file object </p>    <p>  CSocketFile file(&amp;sockRecv); </p>    <p>  // construct an archive </p>    <p>  CArchive arIn(&amp;file, CArchive::load); </p>    <p>  /*or*/_CArchive arOut(&amp;file, CArchive::store); </p>    <p>  // use the archive to pass data </p>    <p>  arIn &gt;&gt; dwValue; </p>    <p>  /*or*/ arOut << dwValue; <p>   (2)Client </p>    <p>  // construct a socket </p>    <p>  CSocket sockClient; </p>    <p>  // create the SOCKET </p>    <p>  sockClient.Create( ); </p>    <p>  // seek a connection </p>    <p>  sockClient.Connect(strAddr, nPort); </p>    <p>  // construct file object </p>    <p>  CSocketFile file(&amp;sockClient); </p>    <p>  // construct an archive </p>    <p>  CArchive arIn(&amp;file, CArchive::load); </p>    <p>  /*or*/_CArchive arOut(&amp;file, CArchive::store); </p>    <p>  // use the archive to pass data </p>    <p>  arOut << dwValue; <p>   /*or*/ arIn &gt;&gt; dwValue; </p>    <p>   上 述 为 Client/Server 模 式 的 两 个 进 程, 用 于 完 成 两 个     进 程 间 一 个 数 据 变 量 的 通 信。 其 中, nPort 是Socket 的 端 口     号,strAddr 是 该 机 器 的IP 地 址( 如 202.197.1.3 或 FTP://RedAlert.com     等), 这 两 个 变 量 在Server 和Client 中 要 一 致。 当Server 进 程 运     行 至 Listen 后 便 处 于 睡 眠 状 态 直 到 Client 进 程 执 行 Connect 时     才 被 唤 醒, 而 后 两 个 进 程 便 开 始 传 输 数 据 了。 </p>    <p>  2、 利 用 CSocket 的 成 员 函 数 实 现 </p>    <p>  (1)Server </p>    <p>  // Socket initial </p>    <p>  if(!AfxSocketInit()){ </p>    <p>   MessageBox(&quot;WindowsSocket initial </p>    <p>   failed!&quot;,&quot;Send&quot;,MB_ICONSTOP); </p>    <p>   Return; </p>    <p>  } </p>    <p>  // Construct two socket </p>    <p>  CSocket ChatSend,server; </p>    <p>  // Creat a SOCKET </p>    <p>  if(!ChatSend.Create(nPort)) // nPort=1025 </p>    <p>   MessageBox(&quot;SendSocket create failed!&quot;, &quot;Send&quot;,MB_ICONSTOP);     </p>    <p>  else{ </p>    <p>   // Associates a local address with the socket ChatSend.Bind(nProt,strAddr); </p>    <p>  // strAddr=&quot;202.196.111.1&quot; </p>    <p>   // Start Listening </p>    <p>   ChatSend.Listen(); </p>    <p>   // Creat a new socket and accepts a connection on </p>    <p>   //the socket </p>    <p>   ChatSend.Accept(Server); </p>    <p>  } </p>    <p>  // Send a CString </p>    <p>  Server.SendTo(csSendText,csCounts,nPort,strAddr); </p>    <p>  // Close the two socket </p>    <p>  Server.Close(); </p>    <p>  ChatSend.Close(); </p>    <p>  (2)Client </p>    <p>  // Socket initial </p>    <p>  if(!AfxSocketInit()){ </p>    <p>   MessageBox(&quot;WindowsSocket initial failed!&quot;,     &quot;Receive&quot;,MB_ICONSTOP); </p>    <p>   return; </p>    <p>  } </p>    <p>  // Construct a socket </p>    <p>  CSocket ChatRecieve; </p>    <p>  // Creat a SOCKET </p>    <p>  if(!ChatReceive.Create()){ </p>    <p>   MessageBox(&quot;ReceiveSocket create </p>    <p>   failed!&quot;,&quot;Receive&quot;,MB_ICONSTOP); </p>    <p>   return; </p>    <p>  } </p>    <p>  else{ </p>    <p>   // Establishes a connection to a peer socket </p>    <p>   ChatReceive.Connect(strAddr,nPort); </p>    <p>  } </p>    <p>  // Receive the CString </p>    <p>  ChatReceive.ReceiveFrom(csReceiveText,csCounts,strAddr,nPort); </p>    <p>  // Close the socket </p>    <p>  ChatReceive.Close(); </p>    <p>   上 述 两 个 进 程 完 成 的 工 作 是 : 由Server 进 程 发 送     一 字 符 串,Client 进 程 接 收。 strAddr 和 nPort 的 含 义 与 方 法1 中     的 相 同 ;csSendText 和 csReceiveText 为 发 送 与 接 收 的 字 符 串 ;csCounts     为 字 串 长 度, 这 一 长 度 在 两 个 进 程 中 要 求 接 收 长 度 小     于 或 等 于 发 送 长 度, 否 则 会 导 致 数 据 传 输 错 误。 另     外, 在 程 序 中 要 加 入 头 文 件afxsock.h, 因 为CSocket 类 的 有 关     说 明 均 在afxsock.h 中。 </p>    <p>   从 上 述 两 种 方 法 中 不 难 发 现, 方 法1 适 合 于 对 多     个 不 同 类 型 数 据 的 通 信, 方 法2 适 合 于 对 字 符 串 的 通     信, 具 体 选 用 何 种 方 法 则 取 决 于 具 体 应 用 的 需 求。 </font></td>  </tr></table></center></div></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -