各位看雪的朋友大家好.
为回报论坛,让新手也能
快乐滴编程,快乐滴学习,贴出之前学习的时候自己写的小文章.
废话不多说,下面即是:
用邮槽技术实现一个局域网聊天的小程序:
20xx年x月x日
刚学习了”邮槽”通讯.然后就想做个稍微实用的东西,就做了(~ o ~)~然后和小伙伴们快乐滴聊天
非常简单易学,代码不到80行哟:
将下面的代码放在一个空工程文件中编译链接即可.
//Author:dalerkd
//地址:http://blog.csdn.net/dalerkd
//Team:15pb
//创建多子个线程实例
#include <stdio.h>
#include <process.h>
#include <windows.h>
//油聊0.1
//目标电脑名字
wchar_t wcCPName[20]=L"";
//存放目标电脑名字拼接结果
wchar_t wcCPNameEnd[40]=L"\\\\";
//发送消息的子线程函数
unsigned int __stdcall ThreadSend(PVOID pM)
{
char tc[40]="";
while (TRUE)
{
printf_s("输入要发送的信息:\r\n");
fflush(stdin);
scanf_s("%s",tc,40);
//1.打开邮槽对象
HANDLE hFile=CreateFile(
wcCPNameEnd,//邮槽名称
GENERIC_WRITE, //读写属性
FILE_SHARE_READ, //共享属性
NULL, //安全属性
OPEN_EXISTING, //打开方式
FILE_ATTRIBUTE_NORMAL, //标志位
NULL //文件模块(默认留空)
);
//2.向mailslot写入
DWORD dwWritten;
LPSTR lpMessage =tc;/*"UDP风暴来袭>>>>>>>>>>>"*/
DWORD dwMegLen = strlen(lpMessage)+sizeof(CHAR);
WriteFile(hFile,lpMessage,dwMegLen,&dwWritten,NULL);
//3.结束
CloseHandle(hFile);
}
return 0;
}
//接收消息的子线程函数
unsigned int __stdcall ThreadReceive(PVOID pM)
{
BOOL bIsTrue = true;
BYTE lpBuffer[0x60]={0};
//1.创建邮槽对象
HANDLE hSlot = CreateMailslot(L"\\\\.\\mailslot\\KITTY",0,MAILSLOT_WAIT_FOREVER,(LPSECURITY_ATTRIBUTES)NULL);
//2.循环读取邮槽信息
while (bIsTrue)
{
//2.1获取邮槽消息数量
DWORD dwMsgCount = 0,dwMsgSize=0;
GetMailslotInfo(hSlot,(LPDWORD)NULL,&dwMsgSize,&dwMsgCount,(LPDWORD)NULL);
if (dwMsgSize==MAILSLOT_NO_MESSAGE)
{
Sleep(2000);
continue;
}
//2.2循环获取全部消息
while (dwMsgCount)
{
DWORD dwRet;
ZeroMemory(lpBuffer,dwMsgSize);
if (!ReadFile(hSlot,lpBuffer,dwMsgSize,&dwRet,NULL))
{
printf("ReadFile执行失败,错误码:%d",GetLastError());
return 0;
}
//显示信息
printf("邮槽内容:%s\n",lpBuffer);
//计算机剩余消息数
GetMailslotInfo(hSlot,(LPDWORD)NULL,&dwMsgSize,&dwMsgCount,nullptr);
}
}
return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
wprintf_s(L"输入对方机器名称全称");
//为了拼接成"\\\\机器名全称\\mailslot\\KITTY"的形式.用于后面的通讯
wscanf_s(L"%s",wcCPName,20);
wcscat_s(wcCPNameEnd,20,wcCPName);
wcscat_s(wcCPNameEnd,40,L"\\mailslot\\KITTY");
const int THREAD_NUM = 2;
HANDLE handle[THREAD_NUM];
handle[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadSend, NULL, 0, NULL);
handle[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadReceive, NULL, 0, NULL);
WaitForMultipleObjects(THREAD_NUM,handle, TRUE, INFINITE);
return 0;
}
用法
输入主机名,也就是局域网中目标计算机的计算机属性的计算机全名.如果你想用本机做测试你应当在开始的时候输入一个”.”对就是小数点然后回车.
注意
它拥有一个远程缓冲区溢出漏洞.这个漏洞是用来练习的.当然它并不影响你在局域网和你的朋友聊天.通常发生在学校机房?
技术
它使用双线程以期望自己能够一边接收消息一边发送消息.关于多线程的知识你可以从
这里获得.
有更多交流可以访问我的
个人技术博客
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课