我有一个在vxworks 6.3上运行的LPD服务器。客户端应用程序(我无法控制)每十分之一秒向我发送一次LPQ查询。在235个请求之后,客户端在尝试连接时收到RST。一段时间后设备将再次接受一些查询(大约300),直到它再次开始发送RST。
我已经确认是导致RST的TCP堆栈。我注意到了一些事情。
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似乎不支持此功能。它可以开启或关闭。
谢谢! 盖尔
答案 0 :(得分:0)
对我来说,这听起来像是在为每个LPQ查询建立一个新连接,在查询完成后你就不会关闭连接。在我看来,正确的做法是接受一个TCP连接然后使用它来获取所有LPQ查询,但是这可能需要客户端应用程序的mod。要避免对客户端进行mod,您应该在每次LPQ查询后关闭TCP连接。
此外,您可以通过调整#define NUM_FILES config.h(或configall.h或其中一个文件)来设置在vxworks中打开的FD的最大数量,但如果您有FD泄漏,这只会推迟错误,你可能会这样做。