gpt4 book ai didi

c++ - Select() 有时不等待

转载 作者:行者123 更新时间:2023-11-27 23:25:51 28 4
gpt4 key购买 nike

我正在写一个聊天程序,我的接收函数有时根本不等待。接收代码如下: 重要的部分基本上是前半部分,但为了以防万一,我添加了整个函数。 (编辑:评论是我自己的,不是给你们阅读的笔记!抱歉!)

ReceiveStatus Server::Receive(PacketInternal*& packetInternalOut)
{
fd_set fds ;
int n ;
struct timeval tv ;

// Set up the file descriptor set.
FD_ZERO(&fds) ;
FD_SET(*p_socket, &fds) ;

// Set up the struct timeval for the timeout.
tv.tv_sec = NETWORKTIMEOUTSEC ;
tv.tv_usec = NETWORKTIMEOUTUSEC ;

// Wait until timeout or data received.
n = select ( *p_socket, &fds, NULL, NULL, &tv ) ;
if ( n == 0)
{
return ReceiveStatus::ReceiveTimeout;
}
else if( n == -1 )
{
return ReceiveStatus::ReceiveSocketError;
}

//need to make this more flexible so it can support others
sockaddr_in fromAddr;
int flags = 0;
int fromLength = sizeof(fromAddr);

char dataIn[TOTALPACKETSIZE];
int bytesIn = recvfrom(*p_socket, dataIn, TOTALPACKETSIZE, flags, (SOCKADDR*)&fromAddr, &fromLength);
// Convert fromAddr into ip, port
if(bytesIn == SOCKET_ERROR)
{
return ReceiveStatus::ReceiveSocketError;
}
if(bytesIn > 0)
{
memcpy(packetInternalOut,dataIn,bytesIn);
return ReceiveStatus::ReceiveSuccessful;
}
else
{
return ReceiveStatus::ReceiveEmpty;
}

}

是否有任何因素会影响此功能是否有效?我的聊天程序可以是服务器也可以是客户端。他们都使用相同的代码。服务器在等待连接时,在 Select() 上等待 100 秒,因为 NETWORKTIMEOUTSEC = 100。但是在 char 程序中,每当我想发送消息时,我首先发送一个传输请求,然后等待一个acknowledgement(对于确认包,我需要再次调用接收)。现在这是不等待的步骤。我的 ReceiveAck 函数调用 Receive(),并且 receive 直接运行整个代码。我可以通过创建一个客户端而不是服务器来测试它。如果我在没有服务器的地方发送一条消息,它应该等待 100 秒以获得确认,然后超时。但是,我一按回车,它就说超时了。

我不知道是什么让它跳过这一步。我已经在服务器和客户端状态下调试了我的聊天程序。 tv 和 fds 的值在两者中是相同的,但是服务器将等待而客户端不会...

最佳答案

select() 的第一个参数比最后一个套接字一个。所以你需要:

n = select ( *p_socket + 1, &fds, NULL, NULL, &tv ) ;

关于c++ - Select() 有时不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596014/

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