如何使c++中的recv()函数超时?
How do I timeout a recv() function in c++?
我有一个在服务器上运行的程序与在客户端上运行的另一个程序通信。它们都来回传送数据和文件。
我注意到,每当有一个socHandler.read()(从套接字读取数据的函数)时,它会在等待数据到达时卡住。
函数是这样的。
int CSocHandler::read(char * inBuffer, INT64 iBytesToRead){
bool blReadMore=false;
int retVal = 0;
int iOutputPointer = 0;
do{
blReadMore = false;
if (iStartOfBuffer == iEndOfBuffer) { //Buffer empty
if (blClosed ) {
return -1;
}
iStartOfBuffer = 0;
iEndOfBuffer = 0;
size_t bufferRemaining = BUFFER_SIZE-iEndOfBuffer;
int bytesRecvd = recv( sock, &buffer[iEndOfBuffer], (int)iBytesToRead<bufferRemaining?iBytesToRead:bufferRemaining), 0 );
if ( bytesRecvd <= 0) {
close();
Yield();
return retVal;
}
}
} while(blReadMore);
return retVal;
}
变量sock的类型是SOCKET,并且是在别处定义的全局变量。我如何设置选项或使此recv()调用非阻塞仅用于此函数调用而不影响任何其他函数?
我相信这就是它在等待数据时卡住的地方,我想让它在X秒后超时。
调用select()
查询套接字是否有挂起的数据,然后调用recv()
读取数据
select(2)
在recv
之前使用。
使用Perl语法,它看起来像
sub read_with_timeout {
my ($sock, $bytes_to_read, $timeout) = @_;
my $sel = IO::Select->new($sock);
my $end_time = Time::HiRes::time() + $timeout;
my $buf = '';
while ($bytes_to_read) {
$timeout >= 0 && () = $sel->can_read($timeout);
or die("Timeout");
my $rv = sysread($sock, $buf, $bytes_to_read, length($buf));
die "read: $!" if !defined($rv);
die "Premature eof" if !$rv;
$bytes_to_read -= $rv;
$timeout = $end_time - Time::HiRes::time();
}
return $buf;
}
can_read
是对select(2)
的调用
相关文章:
- "error: no matching function for call to"构造函数错误
- C++:函数外部的超时功能
- 设置 c/c++ 函数调用的超时
- Winsock2 select() 函数:传递 {0, 0} 作为超时参数
- 如何在线程中运行的函数中设置超时
- 超时后的 CPP 调用函数
- Qt:QFuture/Qt并发超时函数调用
- 何时适合使用 C++11 *_until 超时函数而不是相应的 *_for 函数
- 在选择函数中检测超时的客户端
- Winsock 的 connect() 函数中的超时
- 函数pthread_rwlock_timedwrlock/timedrdlock具有相对超时
- 我需要一个类似std::cin的Mac上的C++函数,但有一个超时
- 如何在c++中实现函数超时
- 设备驱动程序:Windows ReadFile函数超时
- 如何使c++中的recv()函数超时?
- 如何在超时时停止异步求值函数
- 正在获取套接字函数的连接超时
- 如何确定读取文件函数超时
- c++超时函数
- 将超时设置为recv函数