2009-06-22 176 views
0

我正在写一个服务器的测试程序。在测试应用程序,我尽量给客户的大量连接到服务器,但过了一会儿,一个让所有喜欢这类型的错误:套接字意外关闭

Connection reset by peer: socket write error     

java.net.SocketException: Connection reset      

java.net.ConnectException: Connection refused: connect 

我为每个连接到服务器的客户端使用一个新的套接字。

有人能告诉我这种奇怪的行为吗?

回答

0

不幸的是,您没有提供有关服务器性质的更多详细信息。我想你正在写一个典型的TCP服务器。在这个答案中,我将而不是谈论任何Java特定的细节。

简短的建议是:在客户端连接之间插入延迟。没有它,您正在主动模拟针对您的服务器的DoS攻击。

对于更长的一个,请阅读下面。

通常一个TCP服务器创建仅1 通过调用(在可爱的C接口)int sockfd = socket(...)功能,并传递结果(sockfd在我们的例子),以bind()listen()功能停飞。在完成这些准备工作之后,服务器会调用一个accept(),这将使服务器瘫痪(如果套接字被标记为阻塞),并且地球另一端的客户端将开始调用connect()函数,而不是accept()(在服务器上方)在OS内核的支持下将创建连接的套接字

通过查看listen()函数,可能会发现未决连接的实际数量listen()积压参数定义了连接的最大数量OS内核应该排队到套接字(这基本上是SYN_RCVDESTABLISHED状态中的所有连接的总和)。从历史上看,1980年代积压的建议值是5,这在我们的日子里显然是很悲惨的。在FreeBSD 7中。2,例如,用于积压一个硬限制可以通过键入猜到:

 
% sysctl kern.ipc.somaxconn 
kern.ipc.somaxconn: 128 

和Fedora 10中:

 
% cat /proc/sys/net/core/somaxconn 
128 

P.S.
对不起,我可怕的英语。

+0

我明白你想说什么....实际上,这就是我所做的。问题仍然存在,我无法在大量的客户端上测试我的服务器,只是因为我最终得到了一个错误。 – 2009-07-03 11:55:34

0

操作系统和网络服务器限制了多快的速度以及可以启动/接受多少连接。如果您想在服务器上进行性能测试,请尝试使用Apache JMeter,因为它具有解决这些限制的解决方案。

0

您的网站/应用程序服务器一次只能为有限数量的客户端提供服务。

当达到此限制时,您将收到拒绝/重置连接。

希望能回答你的问题。

干杯