socket通常翻译为套接字(文件描述符),当我们使用socket函数创建一个套接字(文件描述符)后,我们可以使用该套接字(文件描述符)来执行很多操作,譬如read、write、open、accpet、connect、recvfrom、sendto等等,这里面的很多操作默认都是阻塞的,而这个阻塞时间就是我今天要讲的socket超时时间,在没有设置socket超时时间的情况下,这些有阻塞行为的操作调用的都是系统默认超时时间。不同的系统会定制不同的socket超时时间,比如本人的Ubuntu10.04的超时时间就是30秒,但多数的系统对于该超时时间的设置都是比较保守的,不会低于30秒。很多情况下,为了让我们的程序更合理,缩短socket超时时间让阻塞动作尽快返回结果就是很有必要了。
用到套接字(文件描述符)超时的地方很广泛,尤其在网络编程方面,为了便于以后编程时候少敲几行代码,本人特意封装了一个接口函数简化socket超时时间的设置过程,特拿出来与大家分享。改函数有三个参数,分别是要设置的套接字、要指定的读超时时间(单位:秒)、要指定的写超时时间(单位:秒)。如果设置成果则返回0,否则返回-1。
int set_sock_time(int fd, int read_sec, int write_sec) { struct timeval send_timeval; struct timeval recv_timeval; if(fd <= 0) return -1; send_timeval.tv_sec = write_sec<0?0:write_sec; send_timeval.tv_usec = 0; recv_timeval.tv_sec = read_sec<0?0:read_sec;; recv_timeval.tv_usec = 0; if(setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &send_timeval, sizeof(send_timeval)) == -1) { return -1; } if(setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &recv_timeval, sizeof(recv_timeval)) == -1) { return -1; } return 0; }
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。
可以试下boost的asio库。
嗯嗯,C++引用boost库可以省不少事,C语言就只能乖乖自己实现了~