Server/Client客户/服务器模式的软件设计方案(请讨论) 1.有必要,不仅仅是效率的问题。2。服务器端必须是非阻塞,试想当服务器Receive数据的时候,如果被阻塞了,结果是整个系统陷入瘫痪的境地。3。典型的你可以模仿一个OICQ程序来设计。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个Socket只负责监听,有client的请求时(OnAccept,不是OnReceive)就再开一个socket来处理,在这个socket的OnReceive事件中接受client发送的数据。注意:新new出来的处理socket的OnClose中要delete this 定义两个类class CListeningSocket : public CAsyncSocket;class CReceivingSocket : public CAsyncSocket;分别用来监听和接收。 1.必须要多线程。否则必然堵塞!2.当然,要不然堵塞了,你的其他的N个CLIENTS就要在那喝西北风了。这个就和你说的一样了,起一个线程主要负责监听。另外的负责处理。反复的使用。起到不阻塞的作用就可以了!! 一个很奇怪的问题服务器端Create成功,listen也成功 m_pSocket = new BServerSocket(this); if (m_pSocket->Create(g_uPort)) { AfxMessageBox("Server Socket create success!"); if (m_pSocket->Listen()) { AfxMessageBox("Server begin listening ......"); } }在BServerSocket中重载了OnAccpet函数,其中m_pServer是BServer类的一个对象void BServerSocket::OnAccept(int nErrorCode){ CSocket::OnAccept(nErrorCode);//重载OnAccept m_pServer->ServerAccpet();}在BServer类中写了ServerAccpet()函数void BServer::ServerAccpet(){ AfxMessageBox("Accept") BClientSocket* pSocket=new BClientSocket(this); m_pSocket->Accept(*pSocket);}但是问题出来了,用客户端联过来,可以弹出Accept这个对话框,但是一到m_pSOcket->(*pSocket)这一步就出错,弹出一个报错对话框说:unhandled exception in exeserver.exe .....不知道为什么,急死人了,我是按照微软的chatsrvr和chatter源吗写的程序,基本没有什么变动,希望大家帮帮我! this 指针到底代表什么?我发现自己的程序中m_pSocket = new BServerSocket(this)并没有把BServer对象指针传进去! BClientSocket类是否定义了构造函数BClientSocket::BClientSocket(BServer*)? 还有你的BClientSocket* pSocket=new BClientSocket(this);返回的pSocket指针是否有效? this这里是指向BServer对象的指针m_pSocket = new BServerSocket(this)肯定传进去了,要不然你根本不会运行到ServerAccpet()中,仔细检查一下你的BClientSocket类 上面的this问题解决了现在新的问题,什么时候开启新进程处理客户端的消息?void BServer::ServerAccpet(){ 在这里? BClientSocket* pSocket=new BClientSocket(this); if (m_pSocket->Accept(*pSocket)) 在这里?}启动新的进程传什么参数进去?是pSocket的指针吗? 一会没看这么多人回复了this的问题。this问题的产生是因为我在主程序中定义了一个BServer的对象,而不是一个对象指针。BServer Server,Server.Start();刚才贴出的代码就是BServer::Start()中的void BServer::Start(){ m_pSocket = new BServerSocket(this); if (m_pSocket->Create(g_uPort)) { AfxMessageBox("Server Socket create success!"); if (m_pSocket->Listen()) { AfxMessageBox("Server begin listening ......"); } }}我调试进来发现this指针根本就没有指向我的BServer对象,所以进入ServerAccept回调函数时m_pSocket就是没主的变量了。解决方法,在主程序中定义对象指针。 BServer* Server = new BServer(); Server->Start();就OK了,呵呵 一般来说,用CSOCKET设计的局域网程序同时可以有几个链接?我对于每个客户端的请求都会开一个线程,这个线程如果遇到客户端死机等问题得不到响音,应该如何判断自动结束? 对于你这个问题http://www.csdn.net/expert/Topic/368/368634.shtm有过讨论 用CAsyncSocket吧,可以更好的控制SOCKET:--你可以用多线程或者不用也可以,因为你毕竟只有最多80个人嘛。--如果不用多线程,则不必担心数据库以及其他的一些同步的问题,但效率是可能会受影响,但你只是在数据库中查询一下数据,没有太复杂的操作,我想不会受到太大的影响。--程序编制过程中,需要注意的是SOCKET中各个事件的处理(FD_ACCEPT、FD_RECEIVE等)--再觉得不过瘾,就直接用WINSOCK吧(C+WIN32),呵呵。 在基于CFormView的单文档程序中如何使用CTabCtrl控件 关于改变其他进程子窗口上控件的内容改变 怎么把属性页设置成单文档应用程序窗体的子窗体? 一个初级的COM问题,请高手们帮忙说说是怎么回事?????? 这样用mic来录音,并生成文件 vc连接数据库。 有关使用串口控件的问题 请问这样赋值对吗? 初学VC碰到问题,请大家务必帮我啊 ,我等了好久了 我是VC++初学者,请问怎样才能用程序动态修改static控件中的文本内容? 请问: 如何将信息保存到“内定的”文件中 要现场开发去了,暂别一段时间了,兄弟们再见,回来结账(DeadWolf)
注意:新new出来的处理socket的OnClose中要delete this
class CListeningSocket : public CAsyncSocket;
class CReceivingSocket : public CAsyncSocket;
分别用来监听和接收。
2.当然,要不然堵塞了,你的其他的N个CLIENTS就要在那喝西北风了。
这个就和你说的一样了,起一个线程主要负责监听。另外的负责处理。反复的使用。起到不阻塞的作用就可以了!!
服务器端Create成功,listen也成功
m_pSocket = new BServerSocket(this);
if (m_pSocket->Create(g_uPort))
{
AfxMessageBox("Server Socket create success!");
if (m_pSocket->Listen())
{
AfxMessageBox("Server begin listening ......");
}
}
在BServerSocket中重载了OnAccpet函数,其中m_pServer是BServer类的一个对象
void BServerSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);//重载OnAccept
m_pServer->ServerAccpet();
}
在BServer类中写了ServerAccpet()函数
void BServer::ServerAccpet()
{
AfxMessageBox("Accept")
BClientSocket* pSocket=new BClientSocket(this);
m_pSocket->Accept(*pSocket);
}但是问题出来了,用客户端联过来,可以弹出Accept这个对话框,但是一到m_pSOcket->(*pSocket)这一步就出错,弹出一个报错对话框说:unhandled exception in exeserver.exe .....
不知道为什么,急死人了,我是按照微软的chatsrvr和chatter源吗写的程序,基本没有什么变动,希望大家帮帮我!
m_pSocket = new BServerSocket(this)肯定传进去了,要不然你根本不会运行到ServerAccpet()中,仔细检查一下你的BClientSocket类
现在新的问题,什么时候开启新进程处理客户端的消息?
void BServer::ServerAccpet()
{
在这里?
BClientSocket* pSocket=new BClientSocket(this);
if (m_pSocket->Accept(*pSocket)) 在这里?
}
启动新的进程传什么参数进去?是pSocket的指针吗?
this问题的产生是因为我在主程序中定义了一个BServer的对象,而不是一个对象指针。
BServer Server,
Server.Start();刚才贴出的代码就是BServer::Start()中的
void BServer::Start()
{
m_pSocket = new BServerSocket(this);
if (m_pSocket->Create(g_uPort))
{
AfxMessageBox("Server Socket create success!");
if (m_pSocket->Listen())
{
AfxMessageBox("Server begin listening ......");
}
}
}
我调试进来发现this指针根本就没有指向我的BServer对象,所以进入ServerAccept回调函数时m_pSocket就是没主的变量了。
解决方法,在主程序中定义对象指针。
BServer* Server = new BServer();
Server->Start();
就OK了,呵呵
我对于每个客户端的请求都会开一个线程,这个线程如果遇到客户端死机等问题得不到响音,应该如何判断自动结束?
http://www.csdn.net/expert/Topic/368/368634.shtm有过讨论
--你可以用多线程或者不用也可以,因为你毕竟只有最多80个人嘛。
--如果不用多线程,则不必担心数据库以及其他的一些同步的问题,但效率是可能会受影响,但你只是在数据库中查询一下数据,没有太复杂的操作,我想不会受到太大的影响。
--程序编制过程中,需要注意的是SOCKET中各个事件的处理(FD_ACCEPT、FD_RECEIVE等)
--再觉得不过瘾,就直接用WINSOCK吧(C+WIN32),呵呵。