2012-02-06 31 views
0

这是我经历了几次,并在短暂的休息后,我回来了一个客户端的应用程序,但只是想在我实际执行任何事情之前记住一些事情。套接字C++ - 非阻塞或选择方法

我将在此讨论一个多客户端服务器,它处理通过TCP连接到服务器绑定端口的客户端。我记得使用select(),FD_ISSET,FD_ZERO,FD_SET进行编码 - 它是家族方法来接受和管理服务器上连接的客户端列表 - 我记得它工作得很好,但这次它是关于一个简单的32人RPG游戏 - 所以没有快节奏的,因此这里的TCP。

简单的GO_TO数据包,WEATHER更改,TIME更新,TEXT消息,项目状态更改和QUITS,LOGINS(广播)以及其他我现在找不到的东西。

什么阻止我今天睡觉是我应该真正选择让这台服务器平稳运行(当谈到它的网络性能时)。

人们倾向于通过使用ioctlsocket(..)或其他一些“线程”怪物来说明套接字的“非阻塞”方法,这些方法是做这件事的,但是您必须以不同的风格来控制它们,并且是的,我已经尝试过这种方式,并看到了许多方法 - 处理应用程序中的许多线程 - 什么是真正的过分复杂...

我也看到了那些MSDN“ASYNCHROUNOUS”套接字,从插座 - 但这是我想的太多了。

因此,而不是编码,我想,很想问,

  • 如果选择()游戏服务器说话的时候可以做的伎俩,处理假设那些32名选手simultanously。我在这里的意思是你如何从你的经历中思考,这是否会做到这一点?或者我将不得不在最后回滚并修改整个服务器代码,同时关闭截止日期。

  • 做select/ioctlsocket究竟有什么区别?

  • 这两种方法有什么优点和缺点?

很多很多非常感谢任何答复,我希望我清楚我在问什么。

+0

在处理和网络代码之间放置了一个抽象层。这样你可以稍后开启网络层。 – 2012-02-06 21:13:49

回答

1

即使在适度的硬件上,select-style服务器也可以轻松处理这些少量的并发客户端。

首先提高可读性,并根据您的经验选择最简单的解决方案。如果你在过去选择了类似的实现,那么不要担心性能。

在我的经验阻止IO很难得到正确的第一次尝试,然后选择的方式,但你的里程可能会有所不同。

1

如果你真的认真对待在C++中使用更高级的网络连接的东西,你应该考虑使用boost::asio,一旦你明白它的理念,就没有什么“过于复杂”了。而且拥有32名玩家的支持最终会将你引入线程的魔掌中,那么为什么不从今天开始呢?

同样重要的是处理死亡连接,无响应客户端以及游戏等待网络输入时对游戏状态的任何更新。你打算如何解决这个问题?

+0

说到处理'死'连接,我用来实现'ping超时'机制,所以服务器发送ping请求给需要回复PONG的客户端 - 如果从客户端没有PONG数据包到服务器超过X秒,连接关闭,广播发送,客户端被删除。另一方面,在套接字上使用select()并不意味着你不会知道客户端连接状态 - 这是通过recv()返回<0,0,> 0来完成的 - 它告诉你你需要什么。 – PeeS 2012-02-06 22:55:01