我已经实现了一个简单的套接字包装类。它包括一个无阻塞功能:加速非阻塞Unix套接字(C++)
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;
}
}
在实践中,似乎有一个〜15ms的延迟时插槽::的recv()是调用。这个延迟是否可以避免?我见过一些使用select()的非阻塞示例,但不明白这可能会有帮助。
谢谢你的建议,但我的问题认为字面上只有1个套接字,其中recv()的调用呈现不可接受的15毫秒延迟。既然它只是轮询1个套接字,我猜猜问题在别处是不正确的吗? – duckworthd 2009-06-25 03:23:04
可能还有其他因素,根据少量代码无法判断发生了什么。如果只有一个套接字,并且我假设您正在等待数据,为什么您要使用非阻塞?这是否意味着您在等待数据时正在做其他事情?其他工作是否有可能让您一收到数据就马上收到数据? – stefanB 2009-06-25 03:37:05