基于多线程的服务端,还没写完。。。
// 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;
}
Rust编程语言群 1036955113
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号