select
检查是否有新的TCP连接。大多数情况下都正常工作,但是当我:1)按下主页按钮,锁定屏幕。2)解锁屏幕,立即按下应用程序图标返回应用程序时。
select
函数会返回,告诉我可以处理我的服务器套接字,在我调用accept
函数之后,它将返回-1,然后我通过getsockopt
检查SO_ERROR
,返回错误EBADF
。以下是代码://listen fd is already nonblocking
if ((*pa = accept(*ps, addr, len)) != -1){
printf("after accept %d %d\n", *pa, errno);
return IO_DONE;
}
printf("after accept error %d %d %d %s\n", *ps, *pa, errno, strerror(errno));
int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (*ps, SOL_SOCKET, SO_ERROR, &error, &len);
if (retval != 0) {
/* there was a problem getting the error code */
fprintf(stderr, "error getting socket error code: %s\n", strerror(retval));
}
if (error != 0) {
/* socket has a non zero error status */
fprintf(stderr, "socket error: %s\n", strerror(error));
}
日志:
after accept error 5 -1 35 Resource temporarily unavailable
socket error: Bad file descriptor
我的测试设备是iPhone 4s,操作系统版本为iOS 8.4.1。
我已经阅读了https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html,但没有发现任何问题。
那么,为什么会出现这种情况,如何解决呢?