windows named pipe 客户端 服务器

简介: 可以实现多客户端对一服务端,服务端为客户端提供服务。 其实一服务端对应每一个client pipe都新建立了一个pipe。windows允许建立多个同名pipe 效果: 服务端代码: #define BUFSIZE 2048 unsigned __stdcall MsgPr...

可以实现多客户端对一服务端,服务端为客户端提供服务。

其实一服务端对应每一个client pipe都新建立了一个pipe。windows允许建立多个同名pipe

效果:

服务端代码:

#define BUFSIZE 2048


unsigned __stdcall MsgProcessThread ( void * pParam)
{
    HANDLE hPipe = (HANDLE)pParam;
    while(1)
    {
        char szBufRecv[1024] = {0};
        DWORD dwReadSize = 0;
        cout<<"服务端准备读消息.."<<endl;
        BOOL bRet = ::ReadFile(hPipe,szBufRecv,1024,&dwReadSize,NULL);
        if(!bRet || dwReadSize == 0)
        {
            DWORD dwLastError = ::GetLastError();
            if(dwLastError == ERROR_BROKEN_PIPE)
                cout<<"断开连接!"<<endl;
            else
                cout<<"ReadFile Error:"<<dwLastError<<endl;
            break;
        }
        else
        {
            cout<<"服务器收到"<<dwReadSize<<"字节:"<<szBufRecv<<endl;
            string srouce_str,a1,a2,str_sum;
            srouce_str = szBufRecv;
            [srouce_str,&a1,&a2,&str_sum](){
                auto pos_flag = srouce_str.find("+");
                if(pos_flag != string::npos)
                {
                    a1 = srouce_str.substr(0,pos_flag);
                    a2 = srouce_str.substr(pos_flag+1);
                    int add_value1 = atoi(a1.c_str());
                    int add_value2 = atoi(a2.c_str());
                    int sum = add_value1 + add_value2;
                    char szTemp[100];
                    _itoa_s(sum,szTemp,100,10);
                    str_sum = szTemp;
                }
            }();
            
            DWORD dwWritten = 0;
            bRet = WriteFile(hPipe,str_sum.c_str(),str_sum.length() + 1,&dwWritten,NULL);
            if(!bRet)
            {
                int nError = ::GetLastError();
                cout<<"服务器WriteFile失败,errorid:"<<nError<<endl;
                break;
            }
            else if(dwWritten == 0)
            {
                cout<<"服务器WriteFile失败,发送字节为0"<<endl;
                break;
            }
        }
    }
    CloseHandle(hPipe);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL; 
    const char *  lpszPipename = ("\\\\.\\pipe\\namedpipe_td"); 
    for (;;) 
    { 

        hPipe = CreateNamedPipeA( lpszPipename,   PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE |  PIPE_READMODE_MESSAGE | PIPE_WAIT,  PIPE_UNLIMITED_INSTANCES,BUFSIZE,BUFSIZE,0,NULL);
        if (hPipe == INVALID_HANDLE_VALUE) 
            return -1;
        BOOL fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); 
        if(fConnected) 
        { 
            CloseHandle((HANDLE)_beginthreadex(NULL,0,MsgProcessThread,(void*)hPipe,0,NULL));
        } 
        else 
            CloseHandle(hPipe); 
    } 
    system("puase");
    return 0;
}

客户端代码

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hPipe = []()->HANDLE
    {
        while(1)
        {
            HANDLE hPipe = CreateFileA( "\\\\.\\pipe\\namedpipe_td",GENERIC_READ |  GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0, NULL);
            if(hPipe != INVALID_HANDLE_VALUE)
            {
                cout<<"open pipe success!"<<endl;
                return hPipe;
            }
            int nErrorId = GetLastError();
            if(nErrorId != ERROR_PIPE_BUSY)
            {
                cout<<"client createfile error :"<<nErrorId<<endl;
                return NULL;
            }

            cout<<"WaitNamedPipeA ..."<<endl;
            if(!WaitNamedPipeA("\\\\.\\pipe\\namedpipe_td",10000))
            {
                if(GetLastError() == ERROR_SEM_TIMEOUT)
                    cout<<"WaitNamePipeA timeOut!"<<endl;
                else
                {
                    cout<<"WaitNamePipeA Failed:"<<GetLastError()<<endl;
                    break;
                }
            }
            else
            {
                cout<<"waitNamedPipe success!"<<endl;
                continue;
            }
        }
        return NULL;
    }();

    if(hPipe == INVALID_HANDLE_VALUE || !hPipe)
    {
        cout<<"connect server failed!"<<endl;
        system("pause");
        return 0;
    }

    cout<<"连接成功!"<<endl;
    DWORD dwMode = PIPE_READMODE_MESSAGE;
    if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL))
    {
        cout<<"SetNamedPipeHandleState failed!"<<endl;
        system("pause");
        return 0;
    }

    while (true)
    {
        char send_buff[256] = {0};
        int a1 = rand() % 100;
        int a2 = rand() % 100;
        sprintf_s(send_buff,"%d+%d",a1,a2);
        DWORD dwWritten = 0;
        if(!WriteFile(hPipe,send_buff,strlen(send_buff)+1,&dwWritten,NULL))
        {
            int nLastError = ::GetLastError();
            if(ERROR_NO_DATA == nLastError)
                cout<<"pipi already closeed!"<<endl;
            else
                cout<<"client writefile failed:"<<nLastError<<endl;
            system("pause");
            return 0;
        }

        if(dwWritten == 0)
        {
            cout<<"client writefile failed dwWritten = 0"<<endl;
            system("pause");
            return 0;
        }

        char buffer_readed[256] = {0};
        DWORD dwReaded = 0;
        Sleep(10);
        if(!ReadFile(hPipe,buffer_readed,256,&dwReaded,NULL))
        {
            int nLastError = ::GetLastError();
            if(ERROR_NO_DATA == nLastError)
                cout<<"pipi already closeed!"<<endl;
            else
                cout<<"client ReadFile failed:"<<nLastError<<endl;
            system("pause");
            return 0;
        }
        if(dwReaded == 0)
        {        
            cout<<"client ReadFile failed:dwReaded == 0"<<endl;
            system("pause");
            return 0;
        }
        char szBuff[256] = {0};
        int nSum = atoi(buffer_readed);
        if(nSum != a1 + a2)
            cout<<"!!错误"<<endl;
        sprintf_s(szBuff,"%d+%d=%s",a1,a2,buffer_readed);
        cout<<szBuff<<endl;
    }
    return 0;
}

 

相关文章
|
11天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
16天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
50 3
|
20天前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
2月前
|
边缘计算 安全 网络安全
|
2月前
|
数据安全/隐私保护 Windows
安装 Windows Server 2019
安装 Windows Server 2019
|
2月前
|
网络协议 Windows
Windows Server 2019 DHCP服务器搭建
Windows Server 2019 DHCP服务器搭建
|
2月前
|
网络协议 定位技术 Windows
Windows Server 2019 DNS服务器搭建
Windows Server 2019 DNS服务器搭建
|
2月前
|
安全 网络协议 数据安全/隐私保护
Windows Server 2019 搭建并加入域
Windows Server 2019 搭建并加入域
|
2月前
|
网络协议 文件存储 Windows
Windows Server 2019 FTP服务器搭建
Windows Server 2019 FTP服务器搭建
|
2月前
|
网络协议 Windows
Windows Server 2019 Web服务器搭建
Windows Server 2019 Web服务器搭建