我遇到的问题是每当我将超时变量uiMaxWaitMs从500更改为2000时,我的进程都会出现延迟。但是这只是一个超时值,并且实际上不应该增加我在select()函数调用中等待的时间。它只允许额外的时间允许超时。我的问题是,如果我从未在500毫秒或2000毫秒内达到超时,uiMaxWaitMS如何影响我的select()函数调用......
当我增加分配的超时值时,我的程序往往需要更长的时间才能通过TCP套接字发送命令......但是根据我的阅读,它应该只允许更长的时间 IF 但是因为我从未达到500毫秒超时的超时,为什么将超时值增加到2000毫秒会使我的性能变差?我知道结构变量的数学是奇怪的,并且对于微秒值(重构旧代码)来说是完全错误的
int CNPEnetConn::RecvByte (char *pcBuffer, unsigned int uiMaxWaitMs)
{
fd_set oReadFds;
struct timeval oTimeout;
if(uiMaxWaitMs >= 1000)
oTimeout.tv_sec = uiMaxWaitMs / 1000;
else
oTimeout.tv_sec = 1;
oTimeout.tv_usec = uiMaxWaitMs;
FD_ZERO (&oReadFds);
FD_SET (m_hostSocket, &oReadFds);
//---- wait for read ready, or timeout or error:
// (With Winsock, the only way to achieve a timeout is by using select)
int iStatus = select (0, &oReadFds, NULL, NULL, &oTimeout);
if (iStatus < 0)
{
return (WSAGetLastError());
}
else if (iStatus == 0)
{
return 0;
}
//---- receive waiting data:
if (recv (m_hostSocket, pcBuffer, 1, 0) != 1)
{
return (WSAGetLastError());
}
return 1;
}
链接到信息select function
链接到信息timeout struct
500毫秒超时
AVG Time: 0.192142794019933
# Deltas > 0.5: 299
Min Time: 4.360000000360742E-4
Max Time: 1.013213000000178
Range Histogram: Total:1505
1.50: 0
1.25: 0
1.00: 14
0.75: 136
0.50: 149
0.25: 149
0.10: 1
0.00: 1056
2000ms超时
AVG Time: 0.9555644471726187
# Deltas > 0.5: 960
Min Time: 3.8500000005115E-4
Max Time: 1.96373100000028
Range Histogram: Total:1344
1.50: 384
1.25: 182
1.00: 10
0.75: 192
0.50: 192
0.25: 192
0.10: 0
0.00: 192
每2秒发送一条消息,时间表示创建消息并发送消息所需的时间。使用WireShark收集数据,并通过我创建的简单Java程序进行分析。