- 论坛徽章:
- 0
|
这几天写的一个telnet客户端类, 这个类被别的程序调用, 跟server发命令并取结果.所有的操作都不能无限时等待. 所以必须加时间控制, 可是出现了一些怪问题
程序没有设置阻塞时, 一切正常, 只是有些地方会一直等下去, 无法响应用户操作.但
1. 用setsockopt将recv的timeout设为一秒(就是SO_RCVTIMEO选项), 可以在windows下正常工作, 不过在unix下, 这句一直返回-1, error为EINTR. 我用while来一直setsockopt, 每次返回值都是这样, 而且没一次设置成功
struct timeval tv_out struct timeval tv_out;
tv_out.tv_sec = 1;
tv_out.tv_usec = 0;
setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv_out, sizeof(tv_out));
因为这个类是一个很大的程序里一个小小的功能, 我也搞不清其它地方对信号是怎么处理的, 所以猜测程序其它地方有用信号, 但如果不设置阻塞, recv并不返回EINTR, 证明程序里并没有产生信号
我试着getsockopt,同样的选项, 返回值里那个长度总是0, 也就是根本没返回任何东西.
2. 如果用fcntl或ioctl将m_socket设置为非阻塞, 这个操作可以成功, 但后面所有的recv全部直接返回,errno为EINTR
3. 最后还是用select实现了, 不将socket 设为阻塞, 只是读数据之前都先select一下, 一切正常了, select也没收到EINTR.
所以请教一下,
1.用setsockopt的时候出错, 可能原因是什么?
2.将描述字设为阻塞后, 无数据可读时errno应该是EAGAIN, 一直是EINTR, 可能的原因是什么呢 |
|