DIY一个局域网聊天的小程序-油聊

刚学习了”邮槽”通讯.然后就想做个稍微实用的东西,就做了(~ o ~)~然后和小伙伴们快乐滴聊天
非常简单易学,代码不到80行哟:
油聊一下
将下面的代码放在一个空工程文件中编译链接即可.

//Author:dalerkd
//地址:http://blog.csdn.net/dalerkd
//创建多子个线程实例
#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;
}
用法

输入主机名,也就是局域网中目标计算机的计算机属性的计算机全名.如果你想用本机做测试你应当在开始的时候输入一个”.”对就是小数点然后回车.

注意

它拥有一个远程缓冲区溢出漏洞.这个漏洞是用来练习的.当然它并不影响你在局域网和你的朋友聊天.通常发生在学校机房?

技术上

它使用双线程以期望自己能够一边接收消息一边发送消息.关于多线程的知识你可以从这里获得.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值