通过pipe进程间通信文档格式.docx
《通过pipe进程间通信文档格式.docx》由会员分享,可在线阅读,更多相关《通过pipe进程间通信文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
512
8./*
************************************
9.*
int
main(VOID)
10.*
功能
pipe
通信服务端主函数
11.**************************************/
12.int
main(int
argc,
TCHAR
*argv[])
13.{
14.
HANDLE
hPipe;
15.
LPTSTR
lpvMessage=TEXT("
Default
message
from
client"
);
16.
chBuf[BUFSIZE];
17.
BOOL
fSuccess;
18.
DWORD
cbRead,
cbWritten,
dwMode;
19.
lpszPipename
=
TEXT("
\\\\.\\pipe\\samplenamedpipe"
20.
21.
if(
argc
>
1
)
//
如果输入了参数,则使用输入的参数
22.
lpvMessage
argv[1];
23.
while
(1)
24.
{
25.
打开一个命名pipe
26.
hPipe
CreateFile(
27.
lpszPipename,
名
28.
GENERIC_READ
|
GENERIC_WRITE,
可读可写
29.
0,
不共享
30.
NULL,
默认安全属性
31.
OPEN_EXISTING,
已经存在(由服务端创建)
32.
默认属性
33.
NULL);
34.
if
(hPipe
!
INVALID_HANDLE_VALUE)
35.
break;
36.
37.
如果不是
ERROR_PIPE_BUSY
错误,直接退出
38.
(GetLastError()
ERROR_PIPE_BUSY)
39.
40.
printf("
Could
not
open
pipe"
41.
return
0;
42.
}
43.
44.
如果所有pipe实例都处于繁忙状态,等待2秒。
45.
(!
WaitNamedPipe(lpszPipename,
2000))
46.
47.
48.
49.
50.
51.
52.
pipe已经连接,设置为消息读状态
53.
dwMode
PIPE_READMODE_MESSAGE;
54.
fSuccess
SetNamedPipeHandleState(
55.
hPipe,
句柄
56.
&
dwMode,
新状态
57.
不设置最大缓存
58.
不设置最长时间
59.
fSuccess)
60.
61.
SetNamedPipeHandleState
failed"
62.
63.
64.
65.
写入pipe
66.
WriteFile(
67.
68.
lpvMessage,
写入的内容
69.
(lstrlen(lpvMessage)+1)*sizeof(TCHAR),
写入内容的长度
70.
实际写的内容
71.
非
overlapped
72.
73.
74.
WriteFile
75.
76.
77.
78.
do
79.
80.
读回复
81.
ReadFile(
82.
83.
chBuf,
读取内容的缓存
84.
BUFSIZE*sizeof(TCHAR),
缓存大小
85.
实际读的字节
86.
87.
88.
GetLastError()
ERROR_MORE_DATA)
89.
//失败,退出
90.
91.
_tprintf(
%s\n"
),
chBuf
打印读的结果
92.
fSuccess);
ERROR_MORE_DATA
或者成功则循环
93.
94.
getch();
//任意键退出
95.
关闭句柄
96.
CloseHandle(hPipe);
97.
98.}
管道服务端代码实现如下,
5./*
6.#define
PIPE_TIMEOUT
5000
4096
结构定义
9.typedef
struct
10.{
11.
OVERLAPPED
oOverlap;
12.
hPipeInst;
13.
chRequest[BUFSIZE];
cbRead;
chReply[BUFSIZE];
cbToWrite;
17.}
PIPEINST,
*LPPIPEINST;
18./*
函数声明
19.VOID
DisconnectAndClose(LPPIPEINST);
20.BOOL
CreateAndConnectInstance(LPOVERLAPPED);
21.BOOL
ConnectToNewClient(HANDLE,
LPOVERLAPPED);
22.VOID
GetAnswerToRequest(LPPIPEINST);
23.VOID
WINAPI
CompletedWriteRoutine(DWORD,
DWORD,
24.VOID
CompletedReadRoutine(DWORD,
25./*
全局变量
26.HANDLE
27./*
28.*
29.*
30.**************************************/
31.int
32.{
hConnectEvent;
oConnect;
LPPIPEINST
lpPipeInst;
dwWait,
cbRet;
fSuccess,
fPendingIO;
用于连接操作的事件对象
hConnectEvent
Crea