连接后非阻塞套接字选择返回1

Kam*_*l_H 2 c sockets linux nonblocking select-function

首先,我想说这是另一个问题而不是这个:类似但不一样

我的代码看起来像这样:

struct addrinfo hints, *res;
struct sockaddr* serveraddr;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

int res2 = getaddrinfo(ip, port, &hints, &res);
printf("getaddrinfo() res: %d, %d\n", res2, errno);

serveraddr = res->ai_addr;

//create new socket

int soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
printf("socket() res: %d, %d\n", socket, errno);

//set nonblocking mode
unsigned long on = 1;
res2 = ioctl(soc, FIONBIO, &on);
printf("ioctl() res: %d\n, %d", res2, errno);

res2 = connect(soc, serveraddr, sizeof(struct sockaddr));
printf("connect() res: %d, %d\n", res2, errno);

//check if socket is ready
fd_set wfds;
FD_ZERO(&wfds);
FD_SET(soc, &wfds);

struct timeval t;
t.tv_sec=15;
t.tv_usec=0;

res2 = select(soc + 1, 0, &wfds, 0, &t);
printf("select() res: %d, %d\n", res2, errno);`
Run Code Online (Sandbox Code Playgroud)

我正在连接到存在的机器(IP地址存在,但没有服务器侦听端口我正在尝试连接).

选择始终返回1.为什么?根据man,它应该超时并返回0.在此之后,当我尝试向socket写入内容时,它返回-1/ECONNREFUSED.

这是预期的行为吗?如果是,如何在select()之后检查我们是否已连接?

Mat*_*Mat 8

我不知道你在man手册页中看到它应该超时的位置.

如果没有防火墙丢弃数据包,连接将被拒绝相当快(来自主机的一个数据包,一个数据包回复).因此,一旦接收到重置,连接插座上的"事件"就会进入.这将唤醒select(至少)一个活动套接字.

第一次尝试读取或写入该套接字将返回基础连接错误.