初学管道,不知道问题出在那?
服务器启动客户端处理
HANDLE SvrHandle;
char pipenamestr[30];
sprintf(pipenamestr, "\\\\cs\\pipe\\pipename ");
SvrHandle=CreateNamedPipe(pipenamestr,
PIPE_ACCESS_DUPLEX|FILE_FLAG_WRITE_THROUGH,
//阻塞模式,这种模式仅对”字节传输管道”操作有效。
PIPE_WAIT|PIPE_TYPE_BYTE,
//字节模式
PIPE_UNLIMITED_INSTANCES,
128,128,
NULL,NULL);
UINT rt = WinExec( "G:\\My Documents\\Visual Studio 6\\【练习】管道\\client\\Debug\\client.exe ",
SW_SHOWNORMAL);
if (rt <31)cout < < "error!\n ";
// SECURITY_ATTRIBUTES结构指针,描述一个新管道,确定子进程的继承权,如果为NULL则该命名管道不能被继承。
if (SvrHandle==INVALID_HANDLE_VALUE)
AfxMessageBox( "管道创建失败,请确定客户端提供连接可能! ");
else
if (ConnectNamedPipe(SvrHandle,NULL)==FALSE)
AfxMessageBox( "建立连接失败! ");
else
{
//用户自定义信息交换函数
cout < < "server ok!\n ";
char str[4];
ReadFile(SvrHandle,str,4*sizeof(char),0,NULL);
cout < <str;
}
if(DisconnectNamedPipe(SvrHandle)==0)
cout < <jks::GetLastError();
客户端代码
HANDLE CltHandle;
char pipenamestr[30];
sprintf(pipenamestr, "\\\\cs\\pipe\\pipename ");
if (WaitNamedPipe( pipenamestr, NMPWAIT_WAIT_FOREVER)==FALSE)
// 管道名要遵循UNC,格式为\ \.\pipe\pipname,名字不分大小写。
AfxMessageBox( "操作失败,请确定服务端正确建立管道实例! ");
else
CltHandle=CreateFile(pipenamestr, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ| FILE_SHARE_WRITE,NULL, OPEN_EXISTING,
//为了与命名管道连接,此参数应一直为OPEN_EXISTING
FILE_ATTRIBUTE_ARCHIVE|FILE_FLAG_WRITE_THROUGH,
// FILE_FLAG_WRITE_THROUGH会使管道WriteFile调用处于阻塞状态,直到数据传送成功。
NULL);
if(CltHandle== INVALID_HANDLE_VALUE)
AfxMessageBox( "管道连接失败 ");
else
{
cout < < "clinet ok!\n ";
//执行用户自定义信息交换函数__从管道读、写信息。
char str[] = "abc ";
WriteFile(CltHandle,str,4*sizeof(char),0,NULL);
}
CloseHandle(CltHandle);
[解决办法]
"\\\\cs\\pipe\\pipename "
管道名必须符合CUN规范
本机的管道名
\\\\.\\pipe\\XXX