gpt4 book ai didi

c++ - 命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:35 24 4
gpt4 key购买 nike

我有一个 C++ 程序正在创建一个命名管道来写入数据。一些客户报告了客户端连接到命名管道但服务器端无法写入数据(ERROR_NO_DATA)的情况。

在我能找到的任何 MSDN 页面中都没有真正解释这个错误代码;有没有人对如何解决这个问题有任何想法?或者是什么原因?


打开代码:

ostringstream pipeName;
pipeName << "\\\\.\\pipe\\unique-named-pipe-" << GetCurrentProcessId();

pipeHandle = CreateNamedPipeA(
pipeName.str().c_str(), // pipe name
PIPE_ACCESS_DUPLEX, // open mode
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // pipe mode
PIPE_UNLIMITED_INSTANCES, // max instances
512, // output buffer size
512, // input buffer size
0, // use default timeouts
NULL); // security attributes

if (INVALID_HANDLE_VALUE == pipeHandle)
{
THROW("Failed to create named pipe", GetLastError());
}

cout << "Pipe ready" << endl;

// Wait for a client to connect to the pipe
BOOL status = ConnectNamedPipe(pipeHandle, NULL);

if (!status)
{
DWORD lastError = GetLastError();

if (ERROR_PIPE_CONNECTED != lastError)
{
THROW("Failed to wait for client to open pipe", lastError);
}
else
{
// Ignore, see MSDN docs for ConnectNamedPipe() for details.
}
}


编写代码:

// response is a std::string
int writeOffset = 0;
int length = response.length();

while ((int) response.length() > writeOffset)
{
DWORD bytesWritten;

BOOL status = WriteFile(
pipeHandle,
response.c_str() + writeOffset,
length - writeOffset,
&bytesWritten,
NULL);

if (!status)
{
// This sometimes fails with ERROR_NO_DATA, why??
THROW("Failed to send via named pipe", GetLastError());
}

writeOffset += bytesWritten;
}


抛出宏

#define THROW(message, errorCode) \
{ \
fprintf(stderr, "%s: line: %d file: %s error:0x%x\n", \
message, __LINE__, __FILE__, errorCode); \
fflush(stderr); \
throw message; \
} \

谢谢!

最佳答案

查看 WinError.h,这是定义此错误代码和其他错误代码的地方:

//
// MessageId: ERROR_NO_DATA
//
// MessageText:
//
// The pipe is being closed.
//
#define ERROR_NO_DATA 232L

听起来客户端已经关闭了他们的管道末端 - 也许客户端代码认为它已经得到了完整的字符串,关闭了他们的末端,而上面的代码继续尝试写入?

关于c++ - 命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25228378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com