有关服务器和多客户端通信的问题!帮忙

alfredzz 2009-08-19 12:40:30
我要在一个服务器---多客户端应用程序中,在通信过程中为每一个客户端都开一个线程,但是客户的数量是
随即的,也就是 DWORD WINAPI ThreadRecv(LPVOID lpParam)的定义应该是动态的,

每一个客服端的功能都一样,应该怎样实现呢!也就是每个用户要使用的代码都相同,但属于不同的线程,

应该怎样解觉呢!我刚学VC,很菜,请帮忙!
...全文
218 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinona 2009-08-20
  • 打赏
  • 举报
回复
很简单,在线程中创建一个条件,当客户离线就销毁当前线程即可
当有新客户连接进来,那你就再新建一个贝
KKK2007 2009-08-20
  • 打赏
  • 举报
回复
thread pool
fantiyu 2009-08-20
  • 打赏
  • 举报
回复
理论来说这种需求应该用IOCP更好些

每个客户端一个线程会导致大量线程切换浪费cpu

针对你的问题, 你应该对每个客户端建立一个类似context的结构体或对象, 其中存放所有和这个客户端相关的数据,比如socket, ip, 端口, 连接时间, 客户端用户名等等, 然后把这个指针作为线程的LPVOID param传入线程, 由线程自行处理就可以了
shfhere 2009-08-20
  • 打赏
  • 举报
回复
如果客户端多的话,用完成端口(IOCP)吧
c517181167 2009-08-20
  • 打赏
  • 举报
回复
mobile3g的话 学习了
见习学术士 2009-08-19
  • 打赏
  • 举报
回复
参考:



UINT _ListenTcpThread(LPVOID lparam)
{//TCP监听线程
CBackupClientDlg *pDlg=(CBackupClientDlg *)lparam;
if(pDlg->StopServer==true) return -1;

CSocket sockSrvr;
pDlg->m_Potr=PORT+pDlg->m_server;
int createSucceed=sockSrvr.Create(pDlg->m_Potr);
if(createSucceed==0)
{
AfxMessageBox("_ListenTcpThread Create错误!"+pDlg->GetError(GetLastError()));
return -1;
}

int listenSucceed=sockSrvr.Listen();//本机指定端口监听网络事件
if(listenSucceed==0)
{
AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
return -1;
}

CSocket recSo;
SOCKADDR_IN client;
int iAddrSize=sizeof(client);
//监听到网络事件交给接收线程处理,监听线程继续监听消息
int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize);
if(acceptSucceed==0)
{
AfxMessageBox("_ListenTcpThread Accept错误!"+pDlg->GetError(GetLastError()));
return -1;
}
sockSrvr.Close();
char flag[FLAG]={0};
if(recSo.Receive(flag,FLAG)!=2)
{
return -1;
}
pDlg->m_type=flag[0];
if(pDlg->m_type=='D') return 0;

pThreadLisen=::AfxBeginThread(_ListenTcpThread,pDlg);
pDlg->ReceiveFileMsg(recSo,client);//接收线程
//接收函数定义如下: ReceiveFileMsg(CSocket &recSo,SOCKADDR_IN &client)
//可以再ReceiveFileMsg函数里创建执行线程。
return 0;

}


雪影 2009-08-19
  • 打赏
  • 举报
回复
Windows网络与通信程序设计
王艳平

有这样的例子
书上有代码
xujg811 2009-08-19
  • 打赏
  • 举报
回复
static DWORD ThreadRecv(LPVOID lpParam);

有一个客户端连接上来就创建一个线程,将ThreadRecv作为每个线程的入口函数
Pro_X 2009-08-19
  • 打赏
  • 举报
回复
又是一个做网络游戏的问题,楼主如果你帮你老板赚了钱会分给你多少啊?
xiyuchenbing 2009-08-19
  • 打赏
  • 举报
回复
完成端口
刘大枭 2009-08-19
  • 打赏
  • 举报
回复
服务器为每进来一个客户端就开启一个线程的话,这样效率很低的。因为CPU要大量的进行线程的创建、销毁与切换。

对于你这种情况,可以用线程池来实现对客户端的处理。如,系统初始化的时候创建100个线程,但这个100个线程都处于挂起状态。一旦有客户端进来,则唤醒一个线程来处理这个客户端,处理完成后这个线程继续进入挂起状态。这个就大大减小了CPU的开销,效率也就会有很大提高。
vieri122 2009-08-19
  • 打赏
  • 举报
回复
accept后,即接收到一个客户端就立马开一个线程,并且把accept返回的socket作为参数传到线程里面去。
chinezwq 2009-08-19
  • 打赏
  • 举报
回复
ThreadRecv这是单线程的接收接口,你要做的肯定要用多线程来解决问题
MoXiaoRab 2009-08-19
  • 打赏
  • 举报
回复
没个客户没区别么,监听者如果收到客户端链接,创建好套接字,启动线程。反正线程函数是一样的呀
alfredzz 2009-08-19
  • 打赏
  • 举报
回复

yestotofu:

客户端少 该怎么弄?
IOCP不知道呀!
alfredzz 2009-08-19
  • 打赏
  • 举报
回复
一楼的能不能再说的清楚一下呢!不明白呀!
yestotofu 2009-08-19
  • 打赏
  • 举报
回复
为每个客户开一个线程,如果你同时在线的客户端少的话没问题,多的话建议用IOCP;
一开始的回忆 2009-08-19
  • 打赏
  • 举报
回复
不太清楚,网络不精通

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧