您好我想知道数据是否在一段时间后没有通过套接字发送,我试图像这样实现它:
int write_t(int sock, void *buf, unsigned int len){
fd_set set;
struct timeval timeout;
int rv;
FD_ZERO(&set);
FD_SET(sock, &set);
timeout.tv_sec = RW_TIMEOUT;
timeout.tv_usec = 0;
rv = select(sock + 1, &set, NULL, NULL, &timeout);
if(rv == -1)
return -1;
else if(rv == 0)
return -2;
else
return write( sock, (unsigned int *)buf, len );
}
然而,当我使用此代码时,程序会阻塞timeout.tv_sec
秒,并且不会发送任何内容。
这里有什么问题?
如何正确实现写入超时?
感谢。
答案 0 :(得分:2)
您正在将FD设置为readfds
,因此您在select中阻塞,直到套接字变为可读,这不会发生,因此您将获得超时。您应该将其设置为writefds
。
请注意,您所做的并不能保证数据实际已发送。它保证某些数据被传输到套接字发送缓冲区中,从而在TCP确定时,它将与写入异步发送。