【发布时间】:2013-10-29 06:12:09
【问题描述】:
我有一个在 vxworks 6.3 上运行的 LPD 服务器。客户端应用程序(我无法控制)每十分之一秒向我发送一个 LPQ 查询。 235 次请求后,客户端在尝试连接时收到 RST。一段时间后,设备将再次接受一些查询(大约 300 个),直到它再次开始发送 RST。
我已经确认是 TCP 堆栈导致了 RST。我注意到了一些事情。
1) 如果我更改正在运行的其他应用程序的数量,我可以稍微更改将接受的套接字数量。例如,我释放了 4 个套接字,从而将接受的数字从 235 更改为 239。
2)如果我向 lpr(端口 515)和另一个端口(例如端口 80)发送请求,则在 RST 开始发生之前接受的连接总数保持在 235 不变。
3)有很多sockets坐在TIME_WAIT。
4)我有一个模拟版本的客户端。如果我将客户端减慢到每四分之一秒一个请求,则服务器不会拒绝连接。
5) 如果我减慢服务器的响应速度,我不会拒绝任何连接。
所以我的理论是 VxWorks 可以在给定时间消耗一些共享资源(我的猜测是套接字句柄的总数)。我也猜测这个数字最高为 255。
有谁知道我如何让 VxWorks 接受更多连接,并在关闭时将它们留在 TIME_WAIT 中?我查看了内核配置并更改了所有看起来很可能的值,但我无法更改数字。
我们知道我们可以设置 SO_LINGER 但这不是一个可接受的解决方案。但是,这确实可以防止客户端连接被拒绝。我们还尝试更改 SO_LINGER 的超时值。这在 VxWorks 中似乎不受支持。它可以打开或关闭。
谢谢! 盖尔
【问题讨论】: