我创建一个TCP服务器套接字,侦听connect()请求和accept()它们 . 接受客户端套接字后,从中接收数据 . 我希望recv()函数以超时阻塞,但它似乎是非阻塞的 .
我从服务器接收响应时已经使客户端处于阻塞模式,但它似乎与服务器端的工作方式不同 .
下面我在阻塞模式下复制粘贴我想要接收数据的服务器端:
int clientSocket = accept(_serverSocket, (struct sockaddr *)NULL, NULL);
if (clientSocket < 0)
return -1;
// set TIMEOUT option to server socket
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 500 * 1000;
int sockOptRet = setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
struct linger sl;
sl.l_onoff = 1; /* non-zero value enables linger option in kernel */
sl.l_linger = 0; /* timeout interval in seconds */
setsockopt(clientSocket, SOL_SOCKET, SO_LINGER, &sl, sizeof(sl));
char _rcvBuffer[sizeof(can_frame)];
int numBytesRcv = recv(clientSocket, _rcvBuffer, sizeof(can_frame), 0);
我也尝试过MSG_WAITALL标志,但它没有改变任何东西......
1 回答
你的代码应该明确阻止,但你的0.5s的超时并没有显示正义 .
如果你将超时增加到更明显的东西(例如2s)并将代码移植到例如beej's tpc server template上,你会得到类似的东西:
现在如果你运行这个然后做:
没有键入要发送的行,在服务器放弃之前应该有一个明显的2秒等待,表明
recv
确实是阻塞的 .