套接字服务器设计建议

时间:2010-03-30 15:20:05

标签: c# sockets winsock

我们正在用c#编写套接字服务器,需要一些关于设计的建议。

背景:客户端(来自移动设备)连接到我们的服务器应用程序,我们将其套接字保持打开状态,以便我们可以随时将数据发送回给他们。数据量各不相同,但我们通常每隔几秒钟从每个客户端发送/接收数据,因此它非常密集。同时连接的数量范围为50-500(以及将来更多)。

我们已经使用异步套接字编写了一个服务器应用程序并且它可以工作,但是我们遇到了一些绊脚石,我们需要确保我们正在做的事情是正确的。

我们有一个包含我们客户端状态的集合(我们目前没有套接字/连接池,是吗?)。

每次客户端连接时,我们创建一个套接字,然后等待它们向我们发送一些数据;在receiveCallBack中,我们将他们的clientstate对象添加到我们的连接字典中(一旦我们验证了它们是谁)。

当客户端对象然后注销时,我们关闭它们的套接字然后关闭它,并将它们从我们的客户端字典集中删除。

据推测,一切都按照正确的顺序进行,一切都按预期进行。

然而,几乎每天它都会停止接受连接,或者我们认为,无论是连接还是连接,但实际上并没有做任何事情,我们无法解决为什么它只是停止。

有些事我们不确定

1)我们应该创建某种连接池而不仅仅是客户端套接字字典

2)连接的套接字会发生什么变化,但是没有添加到我们的字典中,它们只是在内存中无所事事,我们是否应该创建另一个字典,一旦创建它们就保存套接字?

3)如果客户不再连接,找到最佳方法是什么?我们已经阅读了很多方法,但我们不确定最好的方法,发送数据或读取数据,如果是这样的话?

4)如果我们遍历连接dictonary以检查已处置的客户端,我们是否应该锁定字典,如果是这样,这会如何影响同时尝试使用它的其他客户端对象,它会抛出错误还是只是等待?

5)我们经常在随机时间内在ReceiveCallBack方法中获得disposSocketException,这是否意味着我们可以安全地从集合中删除该套接字?

我们似乎无法找到显示任何此类工作的任何生产类型示例。

任何建议都会受到重视

2 个答案:

答案 0 :(得分:0)

4)是的,锁定它。其他线程只需要等待。

通常,您必须在每次访问时锁定字典,包括读取。否则,结构可能会被破坏,这是导致问题的一个可能原因。

答案 1 :(得分:0)

Daryn Kiely有一个good article on socket programming in .NET,我认为你会回答几个问题。它提供了一些良好的背景以及客户端和服务器实现的示例。