我正在写一个类似扑克的游戏,我正在使用winodws套接字进行网络连接。服务器用C ++编写,客户端用C#编写。服务器使用和客户端System.Net/System.Net.Sockets。他们与我所看到的有所不同。
好的,所以对于我的发送/接收消息功能,我使用非阻塞套接字。随着服务器一切工作完美。我称之为非阻塞发送/接收功能,我正在完美地发送/接收所有数据,当没有数据要接收时,我检查WSAGetLastError,如果这个错误有着名的WSAEWOULDBLOCK错误代码,那么我忽略它并继续前进。
现在,在客户端,如果没有要接收的数据,则抛出异常而不是类似于WSAGetLastError的函数,抛出一个错误代码为10035 / WSAEWOULDBLOCK的SocketException。为此,我在try-catch块中有我的接收函数。从我所读到的,try-catch块只有在抛出异常时性能很重,如果没有,那么它没有严重的性能下降。对于消息接收,我有一个时间间隔为100ms的DispatcherTimer,它在try-catch块中有大约50-60行代码,但接收在第二行,并且抛出异常的地方因此移动到catch代码的一部分,其中有一个简单的if块,用于检查异常是否不是WSAEWOULDBLOCK异常并打印出来。
我实际上没有一个明确的问题,我只是想要一些建议。我的问题:
一旦计时器启动,就会有巨大的性能下降。这是从抛出的例外吗?我应该使用,而不是DispatcherTimer,一个单独的线程检查传入的消息?我喜欢DispatcherTimer的想法,因为我不必处理跨线程操作。另外我确实读过有关异步套接字但我不知道。在我看来,对于C ++来说,非阻塞套接字也是一个不错的选择。这个C#异常正在改变整个事情。
我希望你能得到客户的设计。在服务器端我很好。客户端只是一个窗口,DispatcherTimer每100毫秒运行一次,并检查传入的消息。我的问题是性能和简单的代码设计(虽然我不害怕长代码,只要它们是必要的)。思考??
答案 0 :(得分:2)
我刚刚使用了Async套接字,性能问题就消失了。
谢谢大家的帮助