gpt4 book ai didi

c - C 的基本非阻塞 tcp 连接示例

转载 作者:行者123 更新时间:2023-11-30 21:01:31 25 4
gpt4 key购买 nike

我很难理解无 block 套接字以及如何将它们用于网络扫描仪。我知道我应该做的是将套接字设置为非阻塞,如下所示:

fcntl(sockfd , F_SETFL, O_NONBLOCK);

然后只需调用 connect 即可返回 EINPROGRESS。然后我应该像这样使用选择:

if (select(sockfd  + 1, NULL, &fdset, NULL, &tv) == 1)

其中 tv 是 timeval 结构的地址。

然后

getsockopt(sockfd , SOL_SOCKFD ET, SO_ERROR, &so_error, &len);

知道操作是否成功,但它总是正确的。

这里有人能给我一个小型 C 程序的例子吗?检查ip是否可用,解释整个事情?我真的不知道该怎么做。

最佳答案

SO_ERROR 返回套接字的最后一个错误代码并重置它。如果select()报告socket可写,则连接成功,无需检查错误代码。如果 select() 报告超时,则连接仍在进行中,因此错误代码仍为 EINPROGRESS,只需关闭套接字并继续即可。要检测连接失败,请将套接字放入 select()exceptfds 参数中的 fd_set 中,然后检查 SO_ERROR 仅当 select() 返回 > 0 时 fd_set 仍然设置。

fcntl(sockfd, F_SETFL, O_NONBLOCK);

res = connect(sockfd, ...);
if (res == -1)
{
if (errno != EINPROGRESS)
{
// connect failed, do something...
return;
}

fd_set wfd, efd;

FD_ZERO(&wfd);
FD_SET(sockfd, &wfd);

FD_ZERO(&efd);
FD_SET(sockfd, &efd);

timeval tv;
...

res = select(sockfd+1, NULL, &wfd, &efd, &tv);
if (res == -1)
{
// select failed, do something...
close(sockfd);
return;
}

if (res == 0)
{
// connect timed out...
close(sockfd);
return;
}

if (FD_ISSET(sockfd, &efd))
{
// connect failed, do something...
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
close(sockfd);
return;
}
}

// connected !

关于c - C 的基本非阻塞 tcp 连接示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35537276/

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