【发布时间】:2011-08-27 03:20:00
【问题描述】:
我正在运行一个服务器程序,它是用 C 编写的,在 iSeries 机器上运行在 PASE 上。 PASE(便携式 AIX 解决方案环境)是在 IBM iSeries 机器上模拟 AIX。
Server 程序是一个面向连接的迭代 tcp 服务器。
服务器逻辑包含对 accept() 的调用,它返回一个套接字描述符。 随后调用 ioctl() 以使用 F_IONBIO 设置套接字非阻塞。
对 ioctl 的调用间歇性失败,返回 -1 且 errno = 9 (EBADF : bad file descriptor) , 大约 0.8% 的调用次数。一旦针对特定的套接字描述符失败, 下一次失败总是针对相同的套接字描述符和相同的 errno。
发生这种情况时,客户端失败,errno = 73,即对等方重置连接。
服务器是一个守护进程;所以 stdin 在初始化时关闭,并且在 accept() 上可用。 最初我观察到套接字描述符 0 的 ioctl() 失败,但并非总是如此。 因此,我试图通过将 stdin 设置为“/dev/null”来防止套接字描述符 0 的重用,以防出现问题。 但我不确定这是否是主要问题。还没有得到这个改变后的测试结果。
仅在某些机器上观察到此问题,并且通常在机器加载时出现。所以这似乎是某种竞争条件。 服务器逻辑经过良好测试,似乎很稳定。
在 PASE 或 AIX 平台上是否观察到任何与套接字相关的问题?这可能与操作系统有关吗?
任何有关此问题的帮助/指针将不胜感激。
提前致谢,
平均
【问题讨论】:
标签: sockets network-programming ibm-midrange