博文进程间通信详解 - 命名管道实现(转)中 NamedPipeServer.cpp文件总结
2012-08-27 18:48
302 查看
对/article/8497213.html中的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;
}
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;
}
相关文章推荐
- 进程间通信详解 - 匿名管道实现
- 使用命名管道实现进程间通信
- 详解Android 进程间通信的几种实现方式
- 进程间通信详解 - 剪贴板实现
- 进程间通信详解 - 命名管道实现
- 进程间通信详解 - 命名管道实现
- 进程间通信详解 - 邮槽实现
- Linux消息队列实现进程间通信实例详解
- 进程间通信详解 - 剪贴板实现
- 使用命名管道实现进程间通信
- 【转】C#使用命名管道实现进程间通信
- 进程间通信详解 - 动态链接库实现
- 进程间通信详解 - 动态链接库实现
- [转载]使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 命名管道实现进程间通信--石头、剪刀、布游戏
- [转载]使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 【转】linux中使用命名管道实现客户端/服务器模型的进程间通信
- 使用命名管道实现进程间通信