首页
社区
课程
招聘
[原创]百行代码DIY局域网聊天软件-油聊
发表于: 2015-10-24 13:32 6547

[原创]百行代码DIY局域网聊天软件-油聊

2015-10-24 13:32
6547
各位看雪的朋友大家好.
为回报论坛,让新手也能快乐滴编程,快乐滴学习,贴出之前学习的时候自己写的小文章.
废话不多说,下面即是:
用邮槽技术实现一个局域网聊天的小程序:

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直播授课

收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
讲道理的话。。。

msg /server:NICAI * "你是叶良辰?"

用法:
msg  *或主机名  /server:对话主机的局域网ip   信息内容
msg  对话主机的用户名  信息内容
2015-10-24 16:15
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
ls简洁+1
2015-10-25 17:22
0
雪    币: 4
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以加你微信吗?
2018-11-5 20:59
0
雪    币: 1727
活跃值: (925)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看成百万行了
2018-11-10 18:58
0
游客
登录 | 注册 方可回帖
返回
//