我正在运行一个服务器程序,用C语言在iSeries机器上的PASE上运行。 PASE(可移植AIX解决方案环境)是IBM iSeries机器上的AIX仿真。
服务器程序是面向连接的迭代tcp服务器。
服务器逻辑包含对accept()的调用,该调用返回套接字描述符。 接下来调用ioctl()以使用F_IONBIO设置套接字非阻塞。
对ioctl的这次调用间歇性失败,返回-1,errno = 9(EBADF:错误的文件描述符), 约占调用次数的0.8%。一旦特定套接字描述符失败, 下一次失败总是针对相同的套接字描述符并且具有相同的错误。
发生这种情况时,客户端失败,errno = 73,即由对等方重置连接。
服务器是一个守护进程;所以stdin在初始化时关闭,并且在accept()上可用。 最初我发现ioctl()对套接字描述符0失败了,但并非总是如此。 因此,我试图通过将stdin设置为'/ dev / null'来防止重用套接字描述符0,以防出现问题。 但我不确定这是否是主要问题。然而,要在这次改变后得到测试结果。
仅在某些机器上观察到问题,通常是在加载机器时。所以这似乎是某种竞争条件。 服务器逻辑经过了充分测试,似乎很稳定。
是否在PASE或AIX平台上发现任何与套接字相关的问题?这可能与操作系统有关吗?
任何有关此问题的帮助/指示都将不胜感激。
提前感谢,
平均
答案 0 :(得分:1)
您是否有可能遇到每个作业默认最多200个文件描述符?
如果是这样,您可以使用DosSetRelMaxFH()--Change Maximum Number of File Descriptors API来增加限制。
如果这不是问题,我建议收集并检查错误的SST通信跟踪。有关详细信息,请参阅TCP/IP Communications Trace Instructions。
接下来,我将检查组PTF级别,尤其是 SF99315 TCP / IP组PTF 。
IBM支持非常有助于追踪这些问题。