我正在运行一个服务器程序,它是用C编写的,运行在iSeries机器上的PASE上。PASE (Portable AIX Solutions Environment)是在iSeries机器上模拟AIX。
服务器程序是一种面向连接的迭代tcp服务器。
服务器逻辑包含对accept()的调用,它返回一个套接字描述符。然后调用ioctl(),使用F_IONBIO设置套接字的非阻塞状态。
这个对ioctl的调用间歇性地失败,返回-1并返回errno =9 (EBADF : bad file descriptor),大约0.8%的调用次数。一旦对特定套接字描述符失败,下一次失败总是针对相同的套接字描述符和相同的errno。
当发生这种情况时,客户端失败,errno = 73,即连接被对等重置。
服务器是一个守护进程;因此stdin在初始化时关闭,并在接受()时可用。最初,我观察到套接字描述符0的ioctl()失败,但并非总是如此。因此,我试图通过将stdin设置为'/dev/null‘来防止套接字描述符0的重用,以防出现问题。但我不确定这是否是主要问题。但在此更改后仍无法获得测试结果。
仅在某些计算机上观察到该问题,并且通常在计算机加载时出现。因此,这似乎是一种竞争条件。服务器逻辑经过了良好的测试,看起来很稳定。
在PASE或AIX平台上是否观察到任何与套接字相关的问题?这会与操作系统有关吗?
任何关于这个问题的帮助/指示都将不胜感激。
提前谢谢你,
平均
发布于 2011-06-04 14:13:08
您是否有可能遇到每个作业默认最多200个文件描述符的问题?
如果是这样,您可以使用DosSetRelMaxFH()--Change Maximum Number of File Descriptors应用编程接口来增加限制。
如果这不是问题所在,我建议收集并检查错误的SST通信跟踪。有关详细信息,请参阅TCP/IP Communications Trace Instructions。
接下来,我将检查组PTF水平,特别是SF99315 TCP/IP组PTF。
IBM支持对跟踪此类问题非常有帮助。
https://stackoverflow.com/questions/6029567
复制相似问题