0

我有一个在 vxworks 6.3 上运行的 LPD 服务器。客户端应用程序(我无法控制)每十分之一秒向我发送一个 LPQ 查询。235 次请求后,客户端在尝试连接时收到 RST。一段时间后,设备将再次接受一些查询(大约 300 个),直到它再次开始发送 RST。

我已经确认是 TCP 堆栈导致了 RST。我注意到了一些事情。

1)如果我更改正在运行的其他应用程序的数量,我可以稍微更改将接受的套接字数量。例如,我释放了 4 个套接字,从而将接受的数量从 235 更改为 239。 2) 如果我向 lpr(端口 515)和另一个端口(例如端口 80)发送请求,则在此之前接受的连接总数RST 开始发生在 235 保持不变。 3) 有很多套接字坐在 TIME_WAIT。
4)我有一个模拟版本的客户端。如果我将客户端减慢到每四分之一秒一个请求,则服务器不会拒绝连接。5) 如果我减慢服务器的响应速度,我不会拒绝任何连接。

所以我的理论是,VxWorks 可以在给定时间消耗一些共享资源(我的猜测是套接字句柄的总数)。我也猜测这个数字最高为 255。

有谁知道我怎样才能让 VxWorks 接受更多连接,并在关闭时将它们留在 TIME_WAIT 中?我查看了内核配置并更改了所有看起来很可能的值,但我无法更改数字。

我们知道我们可以设置 SO_LINGER 但这不是一个可接受的解决方案。但是,这确实可以防止客户端连接被拒绝。我们还尝试更改 SO_LINGER 的超时值。这在 VxWorks 中似乎不受支持。它是打开还是关闭。

谢谢!盖尔

4

1 回答 1

0

对我来说,听起来您正在为每个 LPQ 查询建立一个新连接,并且在查询完成后您并没有关闭连接。在我看来,正确的做法是接受一个 TCP 连接,然后使用它来获取所有 LPQ 查询,但这可能需要对客户端应用程序进行修改。为避免对客户端进行修改,您应该在每次 LPQ 查询后关闭 TCP 连接。

此外,您可以通过调整#define NUM_FILES config.h(或 configall.h 或其中一个文件)来设置在 vxworks 中打开的最大 FD 数,但如果您有 FD 泄漏,这只会推迟一个错误,您可能做。

于 2013-10-28T22:12:09.350 回答