嗨,我试图知道一段时间后我是否尝试通过插座发送数据,我试图这样实现它:
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
秒为单位,并且不会发送任何内容。这里有什么问题?如何正确实现写入超时?
谢谢。
您将FD设置到readfds
中,因此您将阻止选择,直到插座变得可读性,这是不发生的,因此您可以暂停。您应该将其设置为writefds
。
请注意,您正在做的事情并不能保证数据实际发送。它可以保证某些数据已被转移到套接字发送缓冲区中,从此将在TCP确定时发送,并将其异步到写入。