gpt4 book ai didi

c - 在非阻塞套接字连接中,select() 总是返回 1

转载 作者:太空狗 更新时间:2023-10-29 17:04:55 24 4
gpt4 key购买 nike

我有这个代码段,旨在使用套接字连接来连接到服务器。但是,如果它在一定时间内无法连接到服务器,我希望它停止尝试。我试图用这个非阻塞套接字和 select 命令来做到这一点,但是 select 总是返回 1,表示当我给它的地址什么都不存在时服务器存在。有什么想法吗?

SOCKET tcp_client( char *hname, char *sname )  {    
fd_set fdset;
struct sockaddr_in peer;
SOCKET s;
FD_ZERO(&fdset);
// FD_SET(STDIN, &fdset);
FD_SET(s, &fdset);
errno=1;
struct timeval tv;
tv.tv_sec = 15;
set_address( hname, sname, &peer, "tcp" );
s = socket( AF_INET, SOCK_STREAM, 0 );

int n = 1;
fcntl(s, F_SETFL, O_NONBLOCK);

if ( !isvalidsock( s ) )
{
printf("Socket Call Failed: %s\n", strerror(errno));
return(0);
}

int x = 0;

int status = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) );

if(status < 0) {
printf("Status: %i\n", status);
}

int retVal = select(s+1, &fdset, NULL, NULL, &tv);
printf("retVal: %i\n", retVal);

if (retVal == 1) {
int so_error;
socklen_t slen = sizeof so_error;
getsockopt(s, SOL_SOCKET, SO_ERROR, &so_error, &slen);
if (so_error == 0) {
printf("work\n");

x =1;
} else {
printf("fail\n");
x = 0;
}
} else {
printf("noSocks\n");
}


if (x ==0 )
{
printf("Connect Failed: %s\n", strerror(errno));
L("libOnexc: Connect to socket failed");
close(s);
return(0);
}

return s;
}

最佳答案

我看到的一个问题是您在创建套接字之前将 s 粘在 fdset 中。你需要做的

FD_SET(s, &fdset);

在创建套接字之后,因为 s 只是一个整数,所以在调用 socket() 之前不会是正确的值。

编辑

像这样:

.
.
.
SOCKET s;
errno=1;
struct timeval tv;
tv.tv_sec = 15;
set_address( hname, sname, &peer, "tcp" );
s = socket( AF_INET, SOCK_STREAM, 0 );

int n = 1;
fcntl(s, F_SETFL, O_NONBLOCK);

if ( !isvalidsock( s ) )
{
printf("Socket Call Failed: %s\n", strerror(errno));
return(0);
}

FD_ZERO(&fdset);
FD_SET(s, &fdset); // don't put socket in set until it is actually created

关于c - 在非阻塞套接字连接中,select() 总是返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843810/

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