win平台C语言油槽通信
2016-06-22 01:14
302 查看
进程通信、共享内存
进程与进程之间是不能互相读写内存的,所以需要用到进程通信。
在这种情况下就需要油槽通信,也可以用mutex。
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define MAILSLOT "\\\\.\\mailslot\\eli"
int main()
{
//名称 数量 等待时间 安全属性
//CreateMailslot(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER,NULL)
HANDLE hmailslot = CreateMailslotA(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER,NULL);
if(hmailslot == NULL)
{
printf("创建失败");
return -1;
}
while(1)
{
system("pause");
DWORD dxNextsize = 0; //标识下一个
DWORD dxmsgcount = 0; //消息数量
DWORD readcount = 0; //读取的数量
//文件名 NULL 标记下一个字符串长度 消息条数 NULL
if (GetMailslotInfo(hmailslot, NULL, &dxNextsize, &dxmsgcount, NULL))
{
int i = 0;
for(; i< dxmsgcount; i++)
{
// LPBYTE unsigned char *
LPBYTE lpbuf = malloc(dxNextsize + 1);
//首地址 大小 读的个数
ReadFile(hmailslot, lpbuf, dxNextsize, &readcount, NULL);
printf("%s\n", lpbuf);
}
}
else
{
printf("获取失败!\n");
}
}
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define MAILSLOT "\\\\.\\mailslot\\eli"
void main()
{
//CreateFileA
//名称 写入 共享读 null 打开已经存在
HANDLE hmailslot = CreateFileA(MAILSLOT, \
GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);
if (hmailslot == INVALID_HANDLE_VALUE)
{
printf("打开失败\n");
}
char str[10] = {0};
while(1)
{
scanf("%s", str);
LPBYTE lpmsg = (LPBYTE)str;
int wok = 0;
//句柄 写入的内存首地址 长度 写入成功长度
WriteFile(hmailslot, lpmsg, 10, &wok, NULL);
}
CloseHandle(hmailslot);
system("pause");
}
进程与进程之间是不能互相读写内存的,所以需要用到进程通信。
在这种情况下就需要油槽通信,也可以用mutex。
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define MAILSLOT "\\\\.\\mailslot\\eli"
int main()
{
//名称 数量 等待时间 安全属性
//CreateMailslot(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER,NULL)
HANDLE hmailslot = CreateMailslotA(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER,NULL);
if(hmailslot == NULL)
{
printf("创建失败");
return -1;
}
while(1)
{
system("pause");
DWORD dxNextsize = 0; //标识下一个
DWORD dxmsgcount = 0; //消息数量
DWORD readcount = 0; //读取的数量
//文件名 NULL 标记下一个字符串长度 消息条数 NULL
if (GetMailslotInfo(hmailslot, NULL, &dxNextsize, &dxmsgcount, NULL))
{
int i = 0;
for(; i< dxmsgcount; i++)
{
// LPBYTE unsigned char *
LPBYTE lpbuf = malloc(dxNextsize + 1);
//首地址 大小 读的个数
ReadFile(hmailslot, lpbuf, dxNextsize, &readcount, NULL);
printf("%s\n", lpbuf);
}
}
else
{
printf("获取失败!\n");
}
}
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define MAILSLOT "\\\\.\\mailslot\\eli"
void main()
{
//CreateFileA
//名称 写入 共享读 null 打开已经存在
HANDLE hmailslot = CreateFileA(MAILSLOT, \
GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);
if (hmailslot == INVALID_HANDLE_VALUE)
{
printf("打开失败\n");
}
char str[10] = {0};
while(1)
{
scanf("%s", str);
LPBYTE lpmsg = (LPBYTE)str;
int wok = 0;
//句柄 写入的内存首地址 长度 写入成功长度
WriteFile(hmailslot, lpmsg, 10, &wok, NULL);
}
CloseHandle(hmailslot);
system("pause");
}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#实现子窗体与父窗体通信方法实例总结
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- java和c#使用hessian通信的方法
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结