gpt4 book ai didi

c - 套接字选择失败,操作正在进行 - 非阻塞模式

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:10 25 4
gpt4 key购买 nike

我们的应用程序通过连接和选择操作(c 代码)使用非阻塞套接字。pusedo代码如下

unsigned int ConnectToServer(struct sockaddr_in *pSelfAddr,struct sockaddr_in *pDestAddr)
{
int sktConnect = -1;

sktConnect = socket(AF_INET,SOCK_STREAM,0);
if(sktConnect == INVALID_SOCKET)
return -1;


fcntl(sktConnect,F_SETFL,fcntl(sktConnect,F_GETFL) | O_NONBLOCK);
if(pSelfAddr != 0)
{
if(bind(sktConnect,(const struct sockaddr*)(void *)pSelfAddr,sizeof(*pSelfAddr)) != 0)
{
closesocket(sktConnect);
return -1;
}
}


errno = 0;
int nRc = connect(sktConnect,(const struct sockaddr*)(void *)pDestAddr, sizeof(*pDestAddr));
if(nrC != -1)
{
return sktConnect;
}

if(errno != EINPROGRESS)
{
int savedError = errno;
closesocket(sktConnect);
return -1;
}

fd_set scanSet;
FD_ZERO(&scanSet);
FD_SET(sktConnect,&scanSet);

struct timeval waitTime;
waitTime.tv_sec = 2;
waitTime.tv_usec = 0;

int tmp;
tmp = select(sktConnect +1, (fd_set*)0, &scanSet, (fd_set*)0,&waitTime);
if(tmp == -1 || !FD_ISSET(sktConnect,&scanSet))
{
int savedErrorNo = errno;
writeLog("Connect %s failed after select, cause %d, error %s",inet_ntoa(pDestAddr->sin_addr),savedErrorNo,strerror(savedErrorNo));
closesocket(sktConnect);
return -1;
}

.
.
.
.
.}

问题陈述
在上面的代码中,select 失败,error code 115 是“Operation in progress”。我没有看到任何关于 select 失败并返回 errno 115 的文档。

一个。什么时候 select 在非阻塞套接字中失败并出现 error code 115?在什么情况下?
b.我们是否看到任何提示此问题的系统日志。只关心我们我 - 我找不到任何描述此类问题的文档化功能。


PS:我们使用的是 SUSE Linux 11 企业版。

最佳答案

errno EINPROGRESS 不是来自 select(),它是之前的 connect() 操作遗留下来的。如果 select() 返回-1 FD 未设置,您输入报告它的 block 。所有这些意味着连接仍在进行中。 errno 永远不会被清除,只会被设置。

关于c - 套接字选择失败,操作正在进行 - 非阻塞模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11151140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com