命名管道中的多个写文件和读文件
multiple writefile and readfile in named-pipe
我需要通过管道传递一些字符串。不能通过管道传递指针,必须传递数据。对于传递字符串,我们可以发送一个字符数组。但我不想用数组。我需要一种方法来发送可变大小的字符串。
我使用msdn示例创建管道服务器和管道客户端:
但是在管道客户端和管道服务器中只有一个writeFile和readFile函数,我以这种方式使用它们三次:
我使用了一个结构体来保存字符串的大小。首先这个结构被发送。然后我的两个字符串将被发送。因此,在管道服务器中,首先读取字符串的大小,然后接收两个字符串。
我在客户端和服务器端都定义了这样一个结构:
typedef struct
{
int fileNameLen;
int commandArgLen;
}pipeData,*PpipeData;
pipeData dataToWrite;
pipeData *pdataToWrite = &dataToWrite;
在管道客户端我想发送这个字符串:
LPTSTR s1 = TEXT("file1");
LPTSTR s2 = TEXT("startCmd");
dataToWrite.commandArgLen = sizeof(s1);
dataToWrite.fileNameLen = sizeof(s2);
我以这种方式通过管道客户端发送结构。
fSuccess = WriteFile(
hPipe, // pipe handle
pdataToWrite, // message
sizeof(dataToWrite), // message length
&cbWritten, // bytes written
NULL); // not overlapped
if ( ! fSuccess)
{
_tprintf( TEXT("WriteFile to pipe failed. GLE=%dn"), GetLastError() );
return -1;
}
fSuccess = WriteFile(
hPipe, // pipe handle
s1, // message
sizeof(s1), // message length
&cbWritten, // bytes written
NULL); // not overlapped
if ( ! fSuccess)
{
_tprintf( TEXT("WriteFile to pipe failed. GLE=%dn"), GetLastError() );
return -1;
}
fSuccess = WriteFile(
hPipe, // pipe handle
s2, // message
sizeof(s2), // message length
&cbWritten, // bytes written
NULL); // not overlapped
if ( ! fSuccess)
{
_tprintf( TEXT("WriteFile to pipe failed. GLE=%dn"), GetLastError() );
return -1;
}
在管道服务器中读取管道,我使用3 readFile:
fSuccess = ReadFile(
hPipe, // handle to pipe
pdataToWrite, // buffer to receive data
sizeof(pdataToWrite), // size of buffer
&cbBytesRead, // number of bytes read
NULL); // not overlapped I/O
if (!fSuccess || cbBytesRead == 0)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
{
_tprintf(TEXT("InstanceThread: client disconnected.n"), GetLastError());
break;
}
else
{
_tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.n"), GetLastError());
break;
}
}
// Process the incoming message.
GetAnswerToRequest(TEXT("structure recieved"), pchReply, &cbReplyBytes);
fSuccess = ReadFile(
hPipe, // handle to pipe
s1, // buffer to receive data
dataToWrite.commandArgLen, // size of buffer
&cbBytesRead, // number of bytes read
NULL); // not overlapped I/O
if (!fSuccess || cbBytesRead == 0)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
{
_tprintf(TEXT("InstanceThread: client disconnected.n"), GetLastError());
}
else
{
_tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.n"), GetLastError());
}
break;
}
GetAnswerToRequest(s1, pchReply, &cbReplyBytes);
fSuccess = ReadFile(
hPipe, // handle to pipe
s2, // buffer to receive data
dataToWrite.fileNameLen, // size of buffer
&cbBytesRead, // number of bytes read
NULL); // not overlapped I/O
if (!fSuccess || cbBytesRead == 0)
{
if (GetLastError() == ERROR_BROKEN_PIPE)
{
_tprintf(TEXT("InstanceThread: client disconnected.n"), GetLastError());
}
else
{
_tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.n"), GetLastError());
}
break;
}
GetAnswerToRequest(s2, pchReply, &cbReplyBytes);
这种方式不能正常工作。当管道服务器读取第一个readFile中的数据时,它可能会返回以下错误:ERROR_MORE_DATA(如果我在createNamedPipe中使用了PIPE_TYPE_MESSAGE)
我不知道如何在管道客户端和服务器中使用多个writeFile和readFile
如果在消息模式下读取命名管道,并且下一条消息比nNumberOfBytesToRead参数指定的要长,则ReadFile返回FALSE, GetLastError返回ERROR_MORE_DATA。消息的剩余部分可以通过随后对ReadFile或PeekNamedPipe函数的调用来读取。通过MSDN
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx供参考
相关文章:
- 如何使用管道在父级和子级之间来回传递文件
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- 如何在 bash 中使用管道在 c++ 中使用 getenv() 访问文件?
- 使用命名管道块的读取文件,尽管使用重叠
- 确定文件句柄是否为管道句柄
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 如何将管道作为文件传递到C应用程序
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 读取文件挂在管道读取上
- C++ Windows 管道写入文件到变量?
- 命名管道,选择错误的文件描述符C++
- 检查文件是否是C++中的命名管道 (fifo)
- 管道没有这样的文件或目录
- 使用外部可执行文件作为管道的Qt 'way'是什么?
- 如何检查文件指针/描述符/句柄是否关联到同一个文件/管道/终端
- C++管道,打开的文件太多,错误25
- 管道损坏,FIFO 文件
- 命名管道:连接命名管道返回ERROR_BROKEN_PIPE后的读取文件
- C++ 在关键字段上联接两个管道分隔文件
- 如何将 gdb 的完整堆栈跟踪通过管道传输到文件?