gpt4 book ai didi

sockets - 选择通过TCP套接字超时

转载 作者:行者123 更新时间:2023-12-03 11:57:12 24 4
gpt4 key购买 nike

我对此代码有疑问:

FD_ZERO(&cset);
FD_SET(s, &cset);

tval.tv_sec = TIMEOUT;
tval.tv_usec = 0;

n = select(FD_SETSIZE, &cset, NULL, NULL, &tval);

if (n==-1) {
printf(" select() failed \n");
exit(-1);
}
if (n>0) {
check_control = connect(s,(struct sockaddr*)
&indirizzo_remoto,sizeof(indirizzo_remoto));

if (check_control == -1) {
printf("Errore connect()\n");
}

}else{
printf("Timeout. I'll shutdown the client");
exit(-1);
}

我想为连接插入一个超时,但是它不起作用:

我使用服务器的正确IP地址和端口号,但连接超时。

非常感谢你的帮助。

最佳答案

您正在使用select()在给同一套接字调用connect()之前检查给定套接字是否处于可读状态。那永远都行不通。未连接的TCP套接字永远不会处于可读状态,并且除非先调用select(),否则才能与connect()一起使用。

实现connect()调用超时的唯一方法是首先将套接字置于非阻塞模式(默认情况下,套接字处于阻塞状态),然后调用connect()(如果套接字尝试连接,则返回EINPROGRESS错误),然后使用select()等待套接字进入可写状态,指示连接成功,或者错误状态,指示连接失败。

试试这个:

fcntl(s, F_SETFL, O_NONBLOCK);

或者:
flags = 1;
ioctl(s, FIOBIO, &flags);

取决于您的平台。

然后:
check_control = connect(s, (struct sockaddr*) &indirizzo_remoto, sizeof(indirizzo_remoto));
if (check_control == -1)
{
if (errno != EINPROGRESS)
{
printf("Errore connect()\n");
exit(-1);
}

FD_ZERO(&wset);
FD_SET(s, &wset);

FD_ZERO(&eset);
FD_SET(s, &eset);

tval.tv_sec = TIMEOUT;
tval.tv_usec = 0;

n = select(s+1, NULL, &wset, &eset, &tval);
if (n == -1)
{
printf(" select() failed \n");
exit(-1);
}

if (n == 0)
{
printf("Timeout. I'll shutdown the client");
exit(-1);
}

if (FD_ISSET(s, &eset))
{
printf("Cannot connect. I'll shutdown the client");
exit(-1);
}

int err = -1;
getsockopt(s, SOL_SOCKET, SO_ERROR, &err, sizeof(err));
if (err != 0)
{
printf("Cannot connect. I'll shutdown the client");
exit(-1);
}
}

// connected...

关于sockets - 选择通过TCP套接字超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071338/

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