一、实验目的 1、了解Windows系统中的进程通信机制。 2、熟悉Windows 系统提供的进程通信API。 3、了解命名管道。 二、实验准备知识:相关API函数 1、命名管道 CreateNamedPipe(),创建命名管道。 ConnectNamedPipe (),连接命名管道。 DisconnectNamedPipe (),拆除命名管道的连接。 CallNamedPipe (),客户端连接服务器已经建立的命名管道。 WaitNamedPipe (),客户端等待命名管道。 2、读写文件 ReadFile () WriteFile() 三、实验内容 1、分别编制服务器端程序文件和客户端程序。 2、服务器端流程:创建命名管道——连接命名管道——向命名管道读写数据——拆除与命名管道的连接。 3、客户端流程:等待命名管道——建立与命名管道的连接——向命名管道读写数据。 3、截图并完成实验报告。 四、主要内容(步骤和源代码) 五、实验截图和总结
时间: 2023-12-17 15:02:13 浏览: 29
由于我是一名语言模型AI,无法进行实际的编程和截图操作。以下是实验步骤和源代码供参考。
步骤:
1. 创建命名管道:调用CreateNamedPipe函数创建命名管道,指定管道名称和管道属性。
2. 服务器端等待客户端连接:调用ConnectNamedPipe函数等待客户端连接,该函数会阻塞直到客户端连接成功。
3. 客户端连接命名管道:调用CallNamedPipe函数连接服务器端已经建立的命名管道。
4. 服务器端读写数据:使用ReadFile和WriteFile函数读写数据。
5. 客户端读写数据:使用ReadFile和WriteFile函数读写数据。
6. 断开命名管道连接:服务器端调用DisconnectNamedPipe函数拆除连接。
源代码:
服务器端代码:
```
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hPipe;
char buffer[1024];
DWORD dwRead;
hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\test_pipe"),
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024,
1024,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
printf("Error creating pipe\n");
return 1;
}
printf("Waiting for client...\n");
if (!ConnectNamedPipe(hPipe, NULL)) {
printf("Error connecting to client\n");
CloseHandle(hPipe);
return 1;
}
printf("Client connected\n");
ReadFile(hPipe, buffer, sizeof(buffer), &dwRead, NULL);
printf("Received message: %s\n", buffer);
WriteFile(hPipe, "Hello from server", 18, &dwRead, NULL);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
return 0;
}
```
客户端代码:
```
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hPipe;
char buffer[1024];
DWORD dwWritten, dwRead;
if (!WaitNamedPipe(TEXT("\\\\.\\pipe\\test_pipe"), NMPWAIT_WAIT_FOREVER)) {
printf("Error connecting to server\n");
return 1;
}
hPipe = CreateFile(TEXT("\\\\.\\pipe\\test_pipe"),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
printf("Error connecting to server\n");
return 1;
}
printf("Connected to server\n");
WriteFile(hPipe, "Hello from client", 18, &dwWritten, NULL);
ReadFile(hPipe, buffer, sizeof(buffer), &dwRead, NULL);
printf("Received message: %s\n", buffer);
CloseHandle(hPipe);
return 0;
}
```
总结:
通过本次实验,我们学习了Windows系统中的进程通信机制,熟悉了Windows系统提供的进程通信API,了解了命名管道的使用方法。命名管道可以用于同一台计算机上的进程通信,是一种简单、高效的进程间通信方式。