博文进程间通信详解 - 命名管道实现(转)中 NamedPipeServer.cpp文件总结

http://blog.csdn.net/daofengdeba/article/details/7782381中的NamedPipeServer.cpp终于看懂了,留了注释以做笔记

NamedPipeServer.cpp

#include "NamedPipeServer.h"
int main(int argc, char * argv)
{    CreateNamedPipeInServer();    
 //在服务端往管道中写入数据   
  NamedPipeWriteInServer();    
  //接收客户端发来的数据   
  NamedPipeReadInServer();    
  system("pause");
  return 0;
}

void CreateNamedPipeInServer()
{   
 HANDLE    hEvent;   
 OVERLAPPED   ovlpd;    
 //首先需要创建命名管道    //这里创建的是双向模式且使用重叠模式的命名管道   
 hNamedPipe = CreateNamedPipe(pPipeName, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, 1, 1024, 1024, 0, NULL);   
 if(INVALID_HANDLE_VALUE == hNamedPipe)   
//如果创建文件失败则返回INVALID_HANDLE_VALUE(无效的句柄值)
 {       
  hNamedPipe = NULL;       
  cout<<"创建命名管道失败 ..."<<endl<<endl;       
  return;   
 }     //添加事件以等待客户端连接命名管道    //该事件为手动重置事件,且初始化状态为无信号状态   
 hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    //  创建或打开一个命名的或无名的事件对象
 if(!hEvent)   
 {       
  cout<<"创建事件失败 ..."<<endl<<endl;      
  return;   
 }
 else
 {
   cout<<"执行kkkkkkkkkkkkkkkkk"<<endl;
 }
 cout<<"1"<<endl;
 memset(&ovlpd, 0, sizeof(OVERLAPPED));   
 /* void *memset(void *s, int ch, size_t n);   
 函数解释:将s中前n个字节替换为ch并返回s;   
 memset:作用是在一段内存块中填充某个给定的值,
 它是对较大的结构体或数组进行清零操作的一种最快方法。*/
 //将手动重置事件传递给 ovlap 参数
 cout<<"2"<<endl;
 ovlpd.hEvent = hEvent;
 cout<<"3"<<endl;
 //等待客户端连接   
 if(!ConnectNamedPipe(hNamedPipe, &ovlpd))   
 {       
  if(ERROR_IO_PENDING != GetLastError())      
  {           
   CloseHandle(hNamedPipe);           
   CloseHandle(hEvent);            
   cout<<"等待客户端连接失败 ..."<<endl<<endl;           
   return;       
  }   
 }    
 //等待事件 hEvent 失败  
 if(WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE)) //函数处于等待状态直到hHandle 标记的对象被触发,或者时间到了。如果dwMilliseconds 为0,对象没有被触发
信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds 为INFINITE,对象被触发信号后,函数才会返回  
 {       
  CloseHandle(hNamedPipe);       
  CloseHandle(hEvent);        
  cout<<"等待对象失败 ..."<<endl<<endl;       
  return;   
 }    
 CloseHandle(hEvent);

void NamedPipeReadInServer()
{   
 char *  pReadBuf;   
 DWORD   dwRead;    
 pReadBuf = new char[strlen(pStr) + 1];   
 memset(pReadBuf, 0, strlen(pStr) + 1);    
 //从命名管道中读取数据   
 if(!ReadFile(hNamedPipe, pReadBuf, strlen(pStr), &dwRead, NULL))   
 {       
  delete []pReadBuf;        
  cout<<"读取数据失败 ..."<<endl<<endl;       
  return;   
 }  
 cout<<"读取数据成功:"<<pReadBuf<<endl<<endl;} 
void NamedPipeWriteInServer()
{   
 DWORD    dwWrite;    
 //向命名管道中写入数据   
 if(!WriteFile(hNamedPipe, pStr, strlen(pStr), &dwWrite, NULL))  
 { 
  cout<<"写入数据失败 ..."<<endl<<endl;       
  return;   
 }   
 cout<<"写入数据成功:"<<pStr<<endl<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值