基于多线程的服务端,还没写完。。。

// PosServer.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include "PosServer.h"
#include "Commdef.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// 唯一的应用程序对象
 
CWinApp theApp;
 
using namespace std;
 
 
 
int _tmain( int argc, TCHAR* argv[], TCHAR* envp[] )
{
    int nRetCode = 0;
 
    // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改错误代码以符合您的需要
        _tprintf(_T("错误: MFC 初始化失败\n"));
        nRetCode = 1;
    }
    else
    {
        CreateMeThreadpool(500);
        ServerRun();
    }
 
 
    while(1);
    return nRetCode;
}
 
 
void ServerRun()
{
 
    /* 主机名 */
    char svrName[128];
 
    /* 主机IP */
    int svrIp;
 
    char poststr[2500];
    static WSADATA wsaData;
 
 
    /* hostent 主机的信息*/
    struct hostent * pHostent;
     
 
    memset(&server_address,0, sizeof(struct sockaddr) );
 
 
 
     
    UINT initWskStatus = 0;
 
    if( ( initWskStatus =  WSAStartup(MAKEWORD(2,2), &wsaData) ) != 0 )
    {// 初始化失败
        std::cout<<"SOCKET初始化失败"<<endl;
        return;
         
    }
 
 
    if ( (sockSrv = socket(AF_INET, SOCK_STREAM, 0) ) <0 ){
 
        std::cout<<"SOCKET创建失败"<<endl;
        return;
    }
 
 
    gethostname(svrName, 127);
 
    pHostent = gethostbyname(svrName);
 
 
    memcpy(&svrIp, pHostent->h_addr_list[0], sizeof(pHostent->h_addr_list[0]));
 
 
    /*指定协议族*/
    server_address.sin_family = AF_INET;
 
    /*指定端口将主机序转为网络序*/
    server_address.sin_port = htons(SERVPORT);
 
    /*获取本机IP sin_addr是个结构体*/
    //server_address.sin_addr.s_addr = svrIp;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
     
 
 
 
     
 
    UINT sockerr = bind( sockSrv, (struct sockaddr *) &server_address, sizeof(server_address) );
 
 
    if ( sockerr < 0 )
    {
 
        std::cout<<"端口绑定失败"<<endl;
        return;
 
    }else
    {
        std::cout<<"服务创建成功"<<endl;
        //system("cls");
        //printf("%s \n","create server success!!");
        //printf("hostname: %s\n",svrName);
        //printf("hostinfo: %s", inet_ntoa(server_address.sin_addr));
        //printf(":%d\n",ntohs(server_address.sin_port));
 
        //printf("%s","  \n");
        ////printf("%d","  \n",sockerr);
 
        //printf("%s","wait for client msg!...\n");
    }
 
 
 
    listen(sockSrv, MAXCONNTIONNUM);
    HANDLE hThread = CreateThread(NULL, 0, GetClient, 0, 0, NULL);
 
}
 
 
 
void CreateMeThreadpool(UINT count)
{
 
     
    for (int i=0; i<count; i++)
    {
         
        ThreadObj threadObj;
 
        HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0, 0, NULL);
         
        if ( hThread != NULL )
        {
            //休眠线程 需要判断值
            SuspendThread(hThread);
            threadObj.threadHandle = hThread;
            threadObj.status = 0;
            threadPool.push_back(threadObj);
             
        }
        std::cout<<"第"<<i<<"个线程 \n";
 
 
    }
 
 
}
 
 
DWORD WINAPI GetClient(PVOID lpParamter)
{
    int sinSize = sizeof(struct sockaddr_in);
     
 
 
    while(1)
    {
 
        //标示符
        SOCKET cltSvr;
 
        /* 创建客户端地址信息 */
        struct sockaddr_in cltAddress;
 
         
 
        if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 )
        {
            std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl;
             
            return 0;
 
        }else
        {
            std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl;
 
             
 
            threadParm.sockHandle   = cltSvr;
            threadParm.addres       = cltAddress;
             
            //开始寻找空闲线程池
            threadIter = find_if( threadPool.begin(), threadPool.end(), findx);
 
            if ( threadIter != threadPool.end() )
            {
                threadIter->status = 1;
                std:cout << ResumeThread( threadIter->threadHandle ) << endl;
                //break;
            }
        }
 
 
    }
 
    return 0;
}
 
 
bool findx(ThreadObj &tObj)
{
    return tObj.status == 0;
}
 
 
 
DWORD WINAPI ConnectClientWork(LPVOID lpParam)
{
 
     
    SOCKET cltHandle        = threadParm.sockHandle;
    sockaddr_in  cltAddress = threadParm.addres;
    char recvBuf[100];
    while(1)
    {
         
        recv(cltHandle,recvBuf,sizeof(recvBuf),0);
        std::cout<<recvBuf<<endl;
 
        send(cltHandle,recvBuf,sizeof(recvBuf),0);
    }
 
 
 
     
 
 
 
    return 0;
}

  

 

 

0.0.2版本

// PosServer.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include "PosServer.h"
#include "Commdef.h"
#include "CommandCenter.h"
 
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// 唯一的应用程序对象
 
CWinApp theApp;
 
using namespace std;
 
 
 
int _tmain( int argc, TCHAR* argv[], TCHAR* envp[] )
{
    int nRetCode = 0;
 
    // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改错误代码以符合您的需要
        _tprintf(_T("错误: MFC 初始化失败\n"));
        nRetCode = 1;
    }
    else
    {
        //开辟内存线程池
        CreateMeThreadpool(500);
        ServerRun();
    }
 
 
    while(1);
    return nRetCode;
}
 
 
void ServerRun()
{
 
    /* 主机名 */
    char svrName[128];
 
    /* 主机IP */
    int svrIp;
 
    char poststr[2500];
    static WSADATA wsaData;
 
 
    /* hostent 主机的信息*/
    struct hostent * pHostent;
     
 
    memset(&server_address,0, sizeof(struct sockaddr) );
 
 
 
     
    UINT initWskStatus = 0;
 
    if( ( initWskStatus =  WSAStartup(MAKEWORD(2,2), &wsaData) ) != 0 )
    {// 初始化失败
        std::cout<<"SOCKET初始化失败"<<endl;
        return;
         
    }
 
 
    if ( (sockSrv = socket(AF_INET, SOCK_STREAM, 0) ) <0 ){
 
        std::cout<<"SOCKET创建失败"<<endl;
        return;
    }
 
 
    gethostname(svrName, 127);
 
    pHostent = gethostbyname(svrName);
 
 
    memcpy(&svrIp, pHostent->h_addr_list[0], sizeof(pHostent->h_addr_list[0]));
 
 
    /*指定协议族*/
    server_address.sin_family = AF_INET;
 
    /*指定端口将主机序转为网络序*/
    server_address.sin_port = htons(SERVPORT);
 
    /*获取本机IP sin_addr是个结构体*/
    //server_address.sin_addr.s_addr = svrIp;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
     
 
 
 
     
 
    UINT sockerr = bind( sockSrv, (struct sockaddr *) &server_address, sizeof(server_address) );
 
 
    if ( sockerr < 0 )
    {
 
        std::cout<<"端口绑定失败"<<endl;
        return;
 
    }else
    {
        std::cout<<"服务创建成功"<<endl;
        //system("cls");
        //printf("%s \n","create server success!!");
        //printf("hostname: %s\n",svrName);
        //printf("hostinfo: %s", inet_ntoa(server_address.sin_addr));
        //printf(":%d\n",ntohs(server_address.sin_port));
 
        //printf("%s","  \n");
        ////printf("%d","  \n",sockerr);
 
        //printf("%s","wait for client msg!...\n");
    }
 
 
 
    listen(sockSrv, MAXCONNTIONNUM);
    HANDLE hThread = CreateThread(NULL, 0, GetClient, 0, 0, NULL);
 
}
 
 
 
void CreateMeThreadpool(UINT count)
{
 
 
    for (int i=0; i<count; i++)
    {
 
        ThreadObj threadObj;
        //HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,0, NULL);
        //创建挂起的线程
        HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,CREATE_SUSPENDED, NULL);
 
        if ( hThread != NULL )
        {
 
            SellpThreadPool.push_back( hThread );
 
        }
        std::cout<<"第"<<i<<"个线已加入线程池,已开始自动初始化... \n";
 
 
    }
 
 
}
 
 
void CreateMeThreadpool_bak(UINT count)
{
 
     
    for (int i=0; i<count; i++)
    {
         
        ThreadObj threadObj;
        //HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,0, NULL);
        //创建挂起的线程
        HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,CREATE_SUSPENDED, NULL);
         
        if ( hThread != NULL )
        {
            //休眠线程 需要判断值,将线程挂起
            //SuspendThread(hThread);
            threadObj.id = i;
            threadObj.threadHandle = hThread;
            threadObj.status = 0;
            threadPool.push_back( threadObj );
             
        }
        std::cout<<"第"<<i<<"个线已加入线程池,已开始自动初始化... \n";
 
 
    }
 
 
}
DWORD WINAPI GetClient(PVOID lpParamter)
{
    int sinSize = sizeof(struct sockaddr_in);
 
 
 
    while(1)
    {
 
        //标示符
        SOCKET cltSvr;
 
        /* 创建客户端地址信息 */
        struct sockaddr_in cltAddress;
 
 
 
        if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 )
        {
            std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl;
 
            return 0;
 
        }else
        {
            std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl;
 
 
            //构造好参数
            threadParm.sockHandle   = cltSvr;
            threadParm.addres       = cltAddress;
            HANDLE hT =  SellpThreadPool.back();
            ActiveThreadPool.push_back(hT);
            SellpThreadPool.pop_back();
             
             
            std:cout << ResumeThread( hT  ) << endl;
             
             
        }
 
 
    }
 
    return 0;
}
 
DWORD WINAPI GetClient_bak(PVOID lpParamter)
{
    int sinSize = sizeof(struct sockaddr_in);
     
 
 
    while(1)
    {
         
        //标示符
        SOCKET cltSvr;
 
        /* 创建客户端地址信息 */
        struct sockaddr_in cltAddress;
 
         
 
        if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 )
        {
            std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl;
             
            return 0;
 
        }else
        {
            std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl;
 
             
            //构造好参数
            threadParm.sockHandle   = cltSvr;
            threadParm.addres       = cltAddress;
             
            //寻找休眠线程
            threadIter = find_if( threadPool.begin(), threadPool.end(), findx);
 
            if ( threadIter != threadPool.end() )
            {
                threadParm.id = threadIter->id;
                threadIter->status = 1;
                std:cout << ResumeThread( threadIter->threadHandle ) << endl;
                //break;
            }
        }
 
 
    }
 
    return 0;
}
 
 
bool findx(ThreadObj &tObj)
{
    return tObj.status == 0;
}
 
 
 
 
 
 
 
DWORD WINAPI ConnectClientWork(LPVOID lpParam)
{
 
 
    SOCKET cltHandle        = threadParm.sockHandle;
    sockaddr_in  cltAddress = threadParm.addres;
    char recvBuf[255];
 
    int status = 0;
    while(1)
    {
 
        status = recv( cltHandle,recvBuf,sizeof( recvBuf )+1,0 );
 
        if ( status == 0 || status == SOCKET_ERROR )
        {//处理正常退出和异常退出
 
             
            //没有客户端队列,目前先取消线程的队列
 
 
            acIt = find( ActiveThreadPool.begin(), ActiveThreadPool.end(), GetCurrentThread() );
            if( acIt != ActiveThreadPool.end() ) // finded
            {
 
                shutdown(cltHandle,2);
                closesocket(cltHandle);
                std::cout<<WSAGetLastError()<<endl;
                //挂起该线程
                SuspendThread( GetCurrentThread() );
 
                //在活动队列中去掉线程
                ActiveThreadPool.erase(acIt);
                //在挂起队列中加入
                SellpThreadPool.push_back((*acIt));
            }
 
 
 
 
 
 
        }else
        {
            if ( status > 0 )
            {
                std::cout<<recvBuf<<endl;
                CRITICAL_SECTION cs;
                // EnterCriticalSection(&cs);//加锁
 
                CommmitCmd(cltHandle,recvBuf);
 
                // LeaveCriticalSection(&cs);
            }
 
 
 
        }
        //ZeroMemory(recvBuf,0);
 
        //send(cltHandle,recvBuf,sizeof(recvBuf),0);
    }
 
 
    //挂起当前线程SuspendThread(GetCurrentThread)
 
 
 
 
 
 
 
    return 0;
}
 
 
 
 
 
 
DWORD WINAPI ConnectClientWork_bak(LPVOID lpParam)
{
     
     
    SOCKET cltHandle        = threadParm.sockHandle;
    sockaddr_in  cltAddress = threadParm.addres;
    char recvBuf[255];
 
    int status = 0;
    while(1)
    {
         
        status = recv( cltHandle,recvBuf,sizeof( recvBuf )+1,0 );
         
        if ( status == 0 || status == SOCKET_ERROR )
        {//处理正常退出和异常退出
 
 
            for ( threadIter=threadPool.begin(); threadIter!=threadPool.end(); threadIter++ )
            
                if ( ((*threadIter).id) == threadParm.id )
                {
                    //设置状态
                    (*threadIter).status = 0;
                    std::cout<<"退出线程id:"<<(*threadIter).id<<":句柄:"<<(*threadIter).threadHandle<<endl;
                    break;
                }
 
 
            
 
            shutdown(cltHandle,2);
            closesocket(cltHandle);
            std::cout<<WSAGetLastError()<<endl;
            //挂起该线程
            SuspendThread( GetCurrentThread() );
         
        }else
        {
            if ( status > 0 )
            {
                std::cout<<recvBuf<<endl;
                CRITICAL_SECTION cs;
                // EnterCriticalSection(&cs);//加锁
 
                    CommmitCmd(cltHandle,recvBuf);
 
                // LeaveCriticalSection(&cs);
            }
 
             
 
        }
        //ZeroMemory(recvBuf,0);
 
        //send(cltHandle,recvBuf,sizeof(recvBuf),0);
    }
 
 
    //挂起当前线程SuspendThread(GetCurrentThread)
 
 
 
     
 
 
 
    return 0;
}

  

posted @   方东信  阅读(288)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示