如何使c++中的recv()函数超时?

How do I timeout a recv() function in c++?

本文关键字:函数 超时 recv 何使 c++ 中的      更新时间:2023-10-16

我有一个在服务器上运行的程序与在客户端上运行的另一个程序通信。它们都来回传送数据和文件。

我注意到,每当有一个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)的调用