您的位置:首页 > 编程语言 > C语言/C++

博文进程间通信详解 - 命名管道实现(转)中 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: