邮槽
利用MFC创建两个工程,分为客户端和服务端。
邮槽只能单向通信,一方接收数据,一方发送数据。
服务端创建好邮槽的文件,等待接收数据;客户端向对应的文件中发送数据。
服务端代码:
CreateMailslot 函数用于创建一个邮槽(Mailslot),参数解释:
szSlotName: 邮槽的名称。这是一个字符串,指定了要创建的邮槽的名称。邮槽名通常以\\.\mailslot\ 开头。
0: 最大消息大小。这里设置为0,表示可以接收任意长度的消息。
MAILSLOT_WAIT_FOREVER: 读取消息的超时时间。这里设置为 MAILSLOT_WAIT_FOREVER,表示读操作将永不超时,即永远等待直到有消息到来。
NULL: 安全属性。传递 NULL 表示使用默认的安全描述符。
函数返回一个 HANDLE,这是一个句柄,用于后续对邮槽的操作。如果函数调用成功,返回的句柄可以用于读取从邮槽发送过来的消息。如果函数调用失败,返回值为INVALID_HANDLE_VALUE。在邮槽不再需要时,应使用 CloseHandle 函数关闭句柄,以释放资源。
void CProcessCommunitDlg::OnBnClickedButtonRecv()
{
// TODO: 在此添加控件通知处理程序代码
//创建邮槽
LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\myMailSlot");
HANDLE hSlot = CreateMailslot(szSlotName,//邮槽名字
0,//最大的消息大小
MAILSLOT_WAIT_FOREVER,//永远等待创建成功
NULL);//安全属性
if (hSlot == INVALID_HANDLE_VALUE)
{
TRACE("CreatMailSlot failed with %d\n", GetLastError());
return;
}
//读取数据
char szBuf[100] = {0};
DWORD dwRead;
//把接收到的数据存在szBuf中,数据大小存在dwRead中
if (!ReadFile(hSlot, szBuf, 100, &dwRead, NULL))
{
MessageBox("read Failed!!!");
return;
}
//显示数据
TRACE("####dwRead = %d", dwRead);//显示接收到的数据大小
MessageBox(szBuf);//窗口显示数据
CloseHandle(hSlot);
}
CreateFile 函数通常用于打开或创建文件、设备、文件系统对象(如邮槽Mailslot)等。
CreateFile 函数参数的详细解释:
szSlotName: 邮槽的名称。这是一个字符串,指定了要打开的邮槽的名称。
FILE_GENERIC_WRITE: 访问模式。这里指定了对文件的写访问权限。
FILE_SHARE_READ: 共享模式。这里允许其他进程对邮槽进行读访问。
NULL: 安全属性。这里传递 NULL 表示使用默认的安全描述符。
OPEN_EXISTING: 创建方式。这里指定只打开已存在的邮槽。如果邮槽不存在,函数将失败。
FILE_ATTRIBUTE_NORMAL: 文件属性。这里指定文件属性为普通。
NULL: 模板文件的句柄。用于复制文件属性,这里不使用,故设为 NULL。
函数返回一个 HANDLE,这是一个句柄,用于后续对邮槽的操作。如果函数调用失败,返回值为 INVALID_HANDLE_VALUE。在使用完毕后,应使用 CloseHandle 函数关闭句柄,以释放资源。
客户端代码:
void CProcessClientDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
//创建邮槽的文件句柄,邮槽名字与服务器的必须相同
LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\MyMailSlot");
HANDLE hMailSlot = CreateFile(szSlotName,//邮槽名字
FILE_GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,//打开已存在的文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hMailSlot == INVALID_HANDLE_VALUE)
{
TRACE("create file failed with %d\n", GetLastError());
return;
}
//写入数据
char szBuf[100] = "i am mail slot client!";
DWORD dwWrite;
if (!WriteFile(hMailSlot, szBuf, strlen(szBuf)+1, &dwWrite, NULL))
{
MessageBox("write Failed!!!");
return;
}
CloseHandle(hMailSlot);
}
服务端点击接收按钮,等待接收数据。
客户端点击发送按钮,把写好的数据发送出去。
服务端收到了数据,并用窗口显示出来。