0

我正在尝试在 Windows 中创建一个带有命名管道的基本服务器。尝试连接管道时会出现问题(我怀疑)。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(){
    HANDLE p1, p2;
    printf("Server...");
    p1 = CreateNamedPipe(TEXT("\\\\.\\PIPE\\pipe1"),PIPE_ACCESS_INBOUND,PIPE_TYPE_BYTE|PIPE_WAIT,3,0,0,0,NULL);
    p2 = CreateNamedPipe(TEXT("\\\\.\\PIPE\\pipe2"),PIPE_ACCESS_OUTBOUND,PIPE_TYPE_BYTE|PIPE_WAIT,3,0,0,0,NULL);
    if(p1 == INVALID_HANDLE_VALUE || p2 ==  INVALID_HANDLE_VALUE ) { printf("pipe fail");exit(2);}
    printf("1. Pipes created");
    ConnectNamedPipe(p1,NULL);
    ConnectNamedPipe(p2,NULL);
    printf("2. Pipes connected");


    DisconnectNamedPipe(p1);
    DisconnectNamedPipe(p2);
    CloseHandle(p1);
    CloseHandle(p2);
    printf("3. Pipes disconnected & closed");

    printf("exit server...");

    return 0;

}

运行程序时,它不会打印任何内容,当我手动停止它时,它只会打印 Server...1. Pipes created(在我的 IDE 控制台 - Eclipse 中),或者如果我直接运行程序,它会打印相同的内容然后保持不变。

4

1 回答 1

3

在这里探戈需要两个人。您需要编写另一个调用 CreateFile() 的程序来打开命名管道。只有这样,您的服务器程序中的 ConnectNamedPipe() 调用才会完成。避免在你的测试程序中使用两个管道,管道是双向的,所以你只需要一个管道来来回通信。如果您想支持多个客户端,则只需在建立管道连接后再次调用 ConnectNamedPipe。此时,使用重叠 I/O 或线程也变得很重要。

请查看命名管道的MSDN 文章中包含的示例代码。它向您展示了如何编写服务器和客户端代码。

于 2012-10-18T12:58:23.117 回答