Я реализовал простой класс-оболочку сокетов. Включает неблокирующую функцию:
void Socket::set_non_blocking(const bool b) {
mNonBlocking = b; // class member for reference elsewhere
int opts = fcntl(m_sock, F_GETFL);
if(opts < 0) return;
if(b)
opts |= O_NONBLOCK;
else
opts &= ~O_NONBLOCK;
fcntl(m_sock, F_SETFL, opts);
}
Класс также содержит простую функцию приема:
int Socket::recv(std::string& s) const {
char buffer[MAXRECV + 1];
s = "";
memset(buffer,0,MAXRECV+1);
int status = ::recv(m_sock, buffer, MAXRECV,0);
if(status == -1) {
if(!mNonBlocking)
std::cout << "Socket, error receiving data\n";
return 0;
} else if (status == 0) {
return 0;
} else {
s = buffer;
return status;
}
}
На практике кажется, что при вызове Socket :: recv () происходит задержка ~ 15 мс. Этой задержки можно избежать? Я видел несколько неблокирующих примеров, в которых используется select (), но не понимаю, как это может помочь.