命名管道——大家讨论

smatter 2004-11-22 10:47:52
我最近在研究命名管道,并且实现了简单的操作。在使用过程中也遇到很多问题,拿出来大家一起讨论讨论。我在网上找到过一些关于命名管道的文章和例子,要么是很简单,要么就是很复杂,嘿嘿!

问题一:
在服务器端,我想用GetOverlappedResult来判断有没有数据发送过来的话,创建和设置命名管道要注意哪些地方?
现在的情况是客户端与服务器端建立了连接,并且向服务器端发送了数据,在服务器端我直接用ReadFile的话,是能够正常收到的,但是我想先用GetOverlappedResult来判断有没有数据的到来,每次都是失败的。

问题二:
我一直想知道OVERLAPPED结构里的hEvent是派什么用处的,ConnectNamedPipe、ReadFile、GetOverlappedResult都会用到,这个事件句柄是不是当这些操作(异步)有效时被触发?

***********
暂时到这里
...全文
173 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
smatter 2005-01-21
  • 打赏
  • 举报
回复
已经基本掌握管道通信,呵呵!谢谢大家了!
oyljerry 2004-11-22
  • 打赏
  • 举报
回复
hPipeHandle=Win32API.CreateNamedPipe("\\\\.\\pipe\\pipetest",
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
intPipeMode,
Win32API.CONST.PIPE_UNLIMITED_INSTANCES,
1000,
1000,
NMPWAIT_USE_DEFAULT_WAIT,
null);
ConnectNamedPipe(hPipeHandle, null);


OVERLAPPED ol;
ol.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
ol.Internal=UIntPtr.Zero;
ol.InternalHigh=UIntPtr.Zero;
ol.Offset = 0;
ol.OffsetHigh = 0;
while(1)
{
ReadFile(hPipeHandle,btReceBuff,intBuffSize,&intReceiveSize,&ol);
WaitSingleObject(ol.hEvent);
GetOverlappedResult(hPipeHandle, &ol,&intReceiveSize, false);
.
.

}
yszmax 2004-11-22
  • 打赏
  • 举报
回复
挑张板凳来学习
otrice 2004-11-22
  • 打赏
  • 举报
回复
学习
kingzai 2004-11-22
  • 打赏
  • 举报
回复
see this example hwo to use GetOverlappedResult and namedpipe
#include<windows.h>
#include<stdio.h>
#define NUM_PIPES 5
#define BUFFER_SIZE 256

void main(void)
{
HANDLE PipeHandles[NUM_PIPES];
DWORD BytesTransferred;
CHAR Buffer[NUM_PIPES][BUFFER_SIZE];
INT i;
OVERLAPPED Ovlap[NUM_PIPES];
HANDLE Event[NUM_PIPES];
BOOL DataRead[NUM_PIPES];
DWORD Ret;
DWORD Pipe;
for(i=0;i<NUM_PIPES;i++)
{
if((PipeHandles[i]=CreateNamedPipe("\\\\.\\PIPE\\ZHOUJ",PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,NUM_PIPES,0,0,1000,NULL))==INVALID_HANDLE_VALUE)
{
printf("CreateNamedPipe for pipe %d failed with error %d\n",i,GetLastError());
return ;
}
if((Event[i]=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
{
printf("CreateEvent for pipe %d failed with error %d\n",i,GetLastError());
continue;
}
DataRead[i]=FALSE;
ZeroMemory(&Ovlap[i],sizeof(OVERLAPPED));
Ovlap[i].hEvent=Event[i];
if(ConnectNamedPipe(PipeHandles[i],&Ovlap[i])==0)
{
if(GetLastError()!=ERROR_IO_PENDING)
{
printf("ConnectNamedPipe for pipe %d failed with error %d\n",i,GetLastError());
return;
}
}
}
printf("Server is Now Running\n");
while(1)
{
if((Ret=WaitForMultipleObjects(NUM_PIPES,Event,FALSE,INFINITE))==WAIT_FAILED)
{

printf("WaitForMultipleObjects failed with error %d\n",GetLastError());
return;
}

Pipe=Ret-WAIT_OBJECT_0;
ResetEvent(Event[Pipe]);
if(GetOverlappedResult(PipeHandles[Pipe],&Ovlap[Pipe],&BytesTransferred,TRUE)==0)
{
printf("GetOverlapped result failed %d start over\n",GetLastError());
if(DisconnectNamedPipe(PipeHandles[Pipe])==0)
{
printf("DisconnectNamedPipe failed with error %d\n",GetLastError());
return ;
}
if(ConnectNamedPipe(PipeHandles[Pipe],&Ovlap[Pipe])==0)
{
if(GetLastError()!=ERROR_IO_PENDING)
{
printf("ConnectNamedPipe for pipe %d failed with error %d\n",i,GetLastError());
CloseHandle(PipeHandles[Pipe]);
}
DataRead[Pipe]=FALSE;
}
else
{
if(DataRead[Pipe]==FALSE)
{
ZeroMemory(&Ovlap[Pipe],sizeof(OVERLAPPED));
Ovlap[Pipe].hEvent=Event[Pipe];
if(ReadFile(PipeHandles[Pipe],Buffer[Pipe],BUFFER_SIZE,NULL,&Ovlap[Pipe])==0)
{
if(GetLastError()!=ERROR_IO_PENDING)
{
printf("ReadFile failed with error %d\n",GetLastError());
}
}
DataRead[Pipe]=TRUE;
}
else
{
printf("Received %d bytes,echo bytes back\n",BytesTransferred);
ZeroMemory(&Ovlap[Pipe],sizeof(OVERLAPPED));
Ovlap[Pipe].hEvent=Event[Pipe];
if(WriteFile(PipeHandles[Pipe],Buffer[Pipe],BytesTransferred,NULL,&Ovlap[Pipe])==0)
{
if(GetLastError()!=ERROR_IO_PENDING)
{
printf("WriteFile failed with error %d\n",GetLastError);
}
}
DataRead[Pipe]=FALSE;
}
}
}
}
}
smatter 2004-11-22
  • 打赏
  • 举报
回复
各位大虾多多提点提点!!!
smatter 2004-11-22
  • 打赏
  • 举报
回复
复杂到还好,就是有一些概念不清楚不太明白,因为赶时间,我先用socket来代替算了!
magician21cn 2004-11-22
  • 打赏
  • 举报
回复
好复杂的程序阿,管道问题我还没有接触过,不过马上就要接触拉
smatter 2004-11-22
  • 打赏
  • 举报
回复
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/ipc/base/named_pipe_server_using_overlapped_i_o.htm

写的比较复杂,看不懂!
smatter 2004-11-22
  • 打赏
  • 举报
回复
kingzai
这个例子是MSDN里的,我简单看过些,嘿嘿!有很多地方还是不太了解。
smatter 2004-11-22
  • 打赏
  • 举报
回复
勇敢的心
WaitSingleObject(HANDLE hHandle, DWORD dwMilliseconds)第二个参数你设置多少?是无限等待,还是什么?
while里为什么是ReadFile->WaitSingleObject呢?那后面还是要一次ReadFile吗???才是真正读取了数据。

能不能用GetOverlappedResult直接去判断hPipeHandle有没有数据到来,然后一次性去接受数据?

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧