当前位置: 首页 > news >正文

住房和建设部网站首页广州网站建设系统开发

住房和建设部网站首页,广州网站建设系统开发,网站建设的毕设报告,wordpress替换首页图片使用命名管道实现进程间通信 来源 : VChelp 4.5 进程间通信 在Win32下提供的进程间通信方式有以下几种#xff1a; 剪贴板Clipboard#xff1a;在16位时代常使用的方式#xff0c;CWnd类中提供了支持。 COM/DCOM#xff1a;通过COM系统的代理存根方式进行进程间数据交换 剪贴板Clipboard在16位时代常使用的方式CWnd类中提供了支持。 COM/DCOM通过COM系统的代理存根方式进行进程间数据交换但只能够表现在对接口函数的调用时传送数据通过DCOM可以在不同主机间传送数据。 Dynamic Data Exchange (DDE)在16位时代常使用的方式。 File Mapping文件映射在32位系统中提供的新方法可用来共享内存。 Mailslots邮件槽在32位系统中提供的新方法可在不同主机间交换数据分为服务器方和客户方双方可以通过其进行数据交换在Win9X下只支持邮件槽客户。 Pipes管道分为无名管道在父子进程间交换数据有名管道可在不同主机间交换数据分为服务器方和客户方在Win9X下只支持有名管道客户。 RPC远程过程调用很少使用原因有两个复杂而且与UNIX系统的RCP并不完全兼容。但COM/DCOM的调用是建立在RPC的基础上的。 Windows Sockets网络套接口可在不同主机间交换数据分为服务器方和客户方。相关介绍见Visual C/MFC入门教程 第六章 网络通信开发 WM_COPYDATA通过发送WM_COPYDATA消息并将数据放在参数中来传递数据给其他进程。 下面主要介绍一下命名管道的用法命名管道是一个有名字单向或双向的通信管道。管道的名称有两部分组成计算机名和管道名例如\\[host_name]\pipe\[pipe_name]\括号内为参数。对于同一主机来讲允许有多个同一命名管道的实例并且可以由不同的进程打开但是不同的管道都有属于自己的管道缓冲区而且有自己的通讯环境互不影响并且命名管道可以支持多个客户端连接一个服务器端。命名管道客户端不但可以与本机上的服务器通讯也可以同其他主机上的服务器通讯。 命名管道的连接和通讯采用如下方式 在服务器端第一次创建命名管道后等待连接当客户端连接成功后服务器端的命名管道就用作通讯用途。如果需要再次等待连接服务器端就需要再次打开命名管道创建一个命名管道的实例并等待连接。 对于客户端每次打开命名管道后建立与服务器间的连接然后就可以利用命名管道进行通信如果需要建立第二个连接则需要再次打开管道和再次建立连接。 创建命名管道时需要指定一个主机名和管道名对于客户端来说可以是如下格式\\[host_name]\pipe\[pipe_name]\也可以是\\.\pipe\pipe_name\其中.表示本机。而服务器端只能够在指定本机作为主机名即只能使用下面的格式\\.\pipe_name\。此外需要记住在同一主机上管道名称是唯一的一个命名管道一旦被创建就不允许相同名称的管道再被创建。 服务器方通过 HANDLE CreateNamedPipe(   LPCTSTR lpName,                             // pipe name   DWORD dwOpenMode,                           // pipe open mode   DWORD dwPipeMode,                           // pipe-specific modes   DWORD nMaxInstances,                        // maximum number of instances   DWORD nOutBufferSize,                       // output buffer size   DWORD nInBufferSize,                        // input buffer size   DWORD nDefaultTimeOut,                      // time-out interval   LPSECURITY_ATTRIBUTES lpSecurityAttributes  // SD ); 创建命名管道和打开已经存在的命名管道其中lpName为管道名称dwOpenMode为创建方式可以是下面值的组合 PIPE_ACCESS_INBOUND管道只能用作接收数据。 PIPE_ACCESS_OUTBOUND管道只能用作发送数据。 PIPE_ACCESS_DUPLEX管道既可以发送也可以接收数据。上面这三个值只能够取其中一个 FILE_FLAG_WRITE_THROUGH管道用于同步发送和接收数据只有在数据被发送到目标地址时发送函数才会返回如果不设置这个参数那么在系统内部对于命名管道的处理上可能会因为减少网络附和而在数据积累到一定量时才发送并且对于发送函数的调用会马上返回。 FILE_FLAG_OVERLAPPED管道可以用于异步输入和输出异步读写的有关方法和文件异步读写是相同的。 dwPipeMode指定管道类型可以是下面值的组合 PIPE_TYPE_BYTE数据在通过管道发送时作为字节流发送不能与PIPE_READMODE_MESSAGE共用。 PIPE_TYPE_MESSAGE数据在通过管道发送时作为消息发送不能与PIPE_READMODE_BYTE共用。 PIPE_READMODE_BYTE在接收数据时接收字节流。 PIPE_READMODE_MESSAGE在接收数据时接收消息。 PIPE_WAIT使用等待模式在读写和建立连接时都需要管道的另一方完成相应动作后才会返回。 PIPE_NOWAIT使用非等待模式在读写和建立连接时不需要管道的另一方完成相应动作后就会立即返回。 nMaxInstances为管道的的最大数量在第一次建立服务器方管道时这个参数表明该管道可以同时存在的数量。PIPE_UNLIMITED_INSTANCES表明不对数量进行限制。nOutBufferSize和nInBufferSize表示缓冲区的大小。nDefaultTimeOut表示在等待连接时最长的等待时间以毫秒为单位如果在创建时设置为NMPWAIT_USE_DEFAULT_WAIT表明无限制的等待而以后服务器方的其他管道实例也需要设置相同的值。lpSecurityAttributes为安全属性一般设置为NULL。如果创建或打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。 客户方通过 HANDLE CreateFile(   LPCTSTR lpFileName,                         // file name   DWORD dwDesiredAccess,                      // access mode   DWORD dwShareMode,                          // share mode   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD   DWORD dwCreationDisposition,                // how to create   DWORD dwFlagsAndAttributes,                 // file attributes   HANDLE hTemplateFile                        // handle to template file ); 创建客户端命名管道CreateFile可以有很多用途可以用来创建文件管道邮件槽目录等这里介绍用CreateFile来打开客户端命名管道。lpFileName用来指明管道名称。dwDesiredAccess用来表明使用方式可以使用下面的值 GENERIC_READ打开一个只用于读的管道。 GENERIC_WRITE打开一个只用于写的管道。 GENERIC_READ | GENERIC_WRITE打开一个用于读和写的管道。 dwShareMode指定共享方式一般指定为0lpSecurityAttributes为安全属性一般设置为NULLdwCreationDisposition设置为OPEN_EXISTINGdwFlagsAndAttributes设置为FILE_ATTRIBUTE_NORMAL此外可以还设置为FILE_FLAG_OVERLAPPED来进行异步通讯hTemplateFile设置为NULL。如果打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。 此外客户方可以利用 BOOL CallNamedPipe(   LPCTSTR lpNamedPipeName,  // pipe name   LPVOID lpInBuffer,        // write buffer   DWORD nInBufferSize,      // size of write buffer   LPVOID lpOutBuffer,       // read buffer   DWORD nOutBufferSize,     // size of read buffer   LPDWORD lpBytesRead,      // number of bytes read   DWORD nTimeOut            // time-out value ); 来创建一个发送消息的管道。 管道的连接管理客户方在调用CreateFile后立即就能够建立服务器的连接而服务器方一旦管道打开或创建后可以用 BOOL ConnectNamedPipe(   HANDLE hNamedPipe,          // handle to named pipe   LPOVERLAPPED lpOverlapped   // overlapped structure ); 来等待客户端的连接建立。如果希望在服务器方检测是否有连接到达可以调用 BOOL WaitNamedPipe(   LPCTSTR lpNamedPipeName,  // pipe name   DWORD nTimeOut            // time-out interval ); 这里的lpNamePipeName直接使用创建管道时的名称如果在服务器方希望关闭连接则调用 BOOL DisconnectNamedPipe(   HANDLE hNamedPipe   // handle to named pipe ); 一旦连接被关闭服务器方可以再次调用ConnectNamedPipe来建立连接。如果要关闭管道则直接调用CloseHandle。请注意这里提到的关闭管道和关闭连接是不同的意思在同一个管道上可以依次反复建立连接而且可以减小系统的负荷。而且如果指定了管道最大数量限制那么在打开的管道达到最大限制后如果不关闭旧管道就无法打开新管道。 对于客户方则无法关闭连接而只能直接调用CloseHandle关闭管道。 数据的发送不论是服务器还是客户方都可以通过ReadFile和WriteFile进行管道读写来达到通讯的目的。 下面是一个例子服务器方创建或打开一个管道并读入对方发送的数据将小写字母转换成大写字母后返回而客户发创建一个到服务器的连接并发送一个字符串并读回经过转换的数据 在使用这个例子时运行三个服务端进程而运行第四个时会因为达到管道数量限制而打开管道失败。 //服务方 void CNamed_pipeDlg::OnCreateP() {     DWORD dwTO NMPWAIT_USE_DEFAULT_WAIT;//设置连接等待时间     HANDLE hSvr CreateNamedPipe(\\\\.\\pipe\\test_pipe\\,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE,3,256,256,dwTO,NULL);     if( INVALID_HANDLE_VALUE hSvr)     {         AfxMessageBox(Error create/open pipe);     }     else     {         if (ConnectNamedPipe(hSvr,NULL))         {             BYTE bRead;             DWORD dwRead,dwWritten;             while (ReadFile(hSvr,bRead,1,dwRead,NULL))             {                 if(bRead a bRead $lt;z)                     bRead A (bRead-a);                 WriteFile(hSvr,bRead,1,dwWritten,NULL);             }         }         else         {             AfxMessageBox(error when waiting connected);         }         CloseHandle(hSvr);     } } //客户端 void CNamed_pipe_cDlg::OnConn() {     HANDLE hClient CreateFile(\\\\.\\pipe\\test_pipe\\,GENERIC_WRITE |GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);     if(hClient INVALID_HANDLE_VALUE)     {         AfxMessageBox(Error open pipe);     }     else     {             DWORD dwRead,dwWritten;             char szSend[10]send...;             char szRecv[10];             for(int i0;istrlen(szSend)1;i)             {                 WriteFile(hClient,szSendi,1,dwWritten,NULL);                 ReadFile(hClient,szRecvi,1,dwRead,NULL);             }             CloseHandle(hClient);//close pipe             AfxMessageBox(szRecv);     } }
http://wiki.neutronadmin.com/news/327730/

相关文章:

  • 免费静态网站托管平台南宁建站模板厂家
  • 有关企业电子网站建设论文安徽建设网官方网站
  • 北京做兼职网站有哪些北京设计公司有哪些公司
  • 网站建设商城制作怎么提高网站响应速度
  • 惠州市两学一做网站嘉定网站建设公司
  • 网站能实现什么功能做网站找个人还是公司
  • 汕头企业制作网站推广合肥 中网站
  • 网站建设与维护1997年WordPress系统配置要求
  • 做网站的域名是做什么用的荥阳做公司网站的公司
  • 惠州市网站建设公司免费软件电视剧最全
  • 网站单页支付宝支付怎么做怎样申请微信小程序开店
  • 网站的设计与制作论文题目温州市网站建设哪家公司好
  • iis网站子目录设置二级域名可以做设计私单的网站
  • 直播间挂人气自助网站网站被抄袭
  • 番禺建设网站哪家好4399游戏官网
  • 东莞做网站 自媒体网站建设案例 算命网站
  • 北京市网站制作郑州做网站哪家比较好
  • 菏泽科技网站建设购物网站开发环境
  • 网站模板 北京公司企业网站建设需要哪些软件
  • 用wordpress建站一定要先有域名和空间吗网站外链建设:论坛签名是否还值得做
  • 做试管婴儿的网站青岛易龙网站建设
  • 有教做点心的网站吗光谷做网站推广价格
  • 广州大石附近做网站的公司哪家好软件开发工程师报考条件
  • 珠海专业制作网站外链seo招聘
  • 博物馆门户网站建设优势建设菠菜网站
  • 网站备案注销 万网沈阳市三好街网站建设公司
  • 东八区网站建设wordpress修改器
  • 做优化的网站超链接怎么做
  • 学校网站建设 效果电商创业新手怎么做
  • 有做数学题的网站吗WordPress支持you2php吗