c-我的第一个窗口名为pipe,不确定出了什么问题



编辑:这是整个代码,忽略罗马尼亚语注释。还有2或3个名字是罗马尼亚语未翻译的:http://pastebin.com/JjtayvXX

我正在努力学习操作系统的基础知识,现在我正在windows下使用命名管道,我不知道出了什么问题。

老实说,我正在学习一个朋友做的例子,但他和我一样糟糕。虽然hi的程序有效(尽管它做了其他事情),但他无法解释任何事情,很可能只是从某个地方复制的,仍然。。。不重要,我想说的是,我是从例子中学习,而不是从专业的例子中学习。

服务器从客户端接收消息,返回最大值和最小值。

服务器:

#include "windows.h"
#include "stdio.h"
struct Msg {
int numbers[20];
int length;
};
...
int main () {
HANDLE inputPipe, outputPipe; 
Msg msg;
while (true) {
inputPipe = CreateNamedPipe ("\\.\pipe\Client2Server",
PIPE_ACCESS_INBOUND,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 
PIPE_UNLIMITED_INSTANCES,
0, //Numb of output bytes
sizeof(Msg),  // Numb of input bytes
0, // Wait forever
NULL); // Don't know how to use security
ConnectNamedPipe (inputPipe,NULL);
// Here is where the server dies
ReadFile (inputPipe, &msg,sizeof(Msg),NULL,NULL); 

现在客户:

struct Msg {
int numbers[20];
int length;
};

int main () {
HANDLE outputPipe, inputPipe;
Msg msg;
// @misc: read data from keyboard, create msg   
outputPipe = CreateFile ("\\.\pipe\Client2Server",
GENERIC_WRITE,
FILE_SHARE_READ, // * comment after code
NULL, // again, I know nothing about security attributes
CREATE_ALWAYS, // either create or overwrite
0,
NULL);
// Here is where it dies
WriteFile (outputPipe, &msg, sizeof(Msg), NULL, NULL);

我获得写入位置0x00000000的访问冲突。不知道为什么。

  • 我希望这个进程只写,另一个进程(服务器)只读。FILE_SHARE_READ可以吗

我也不知道如何处理CreationDisposition/FlagsAndAttributes(CreateFile的最后两个参数),它们可以吗?

编辑:添加了实际答案,引用了其他主题,我自己尝试了

WriteFile()'s第四个参数(指向将存储字节数的变量的指针)不应为null。根据API描述,如果第五个参数lpOverlapped不为空,则此参数只能为NULL。

请参阅此处的类似主题:为什么WriteFile在写入标准输出时崩溃?


是否可以检查/打印ReadFile()(如果返回=0FALSE则失败)和client.cCreateFile()(如果返回INVALID_HANDLE_VALUE则失败)的返回值,以查看它们是否成功?

如果失败,您能否在调用后立即打印GetLastError()返回的值,以便我们可以看到具体的错误?

最新更新