我目前在项目中使用套接字,我希望在recv函数中设置5秒的超时。我在this question中找到setsockopt
SO_RCVTIMEO 选项,应该这样做,但问题是它也会影响accept()
函数,我只想要超时对于recv()
函数。以下是我设置超时的方法:
/*Setting timeout for bad headers*/
struct timeval tv;
tv.tv_sec = 5; /* 5 seconds timeout for receiving a request */
tv.tv_usec= 0;
setsockopt(fd, SOL_SOCKET,
SO_RCVTIMEO,(struct timeval *)&tv,
sizeof(struct timeval));
这个想法是,如果客户端发送损坏的标头(例如,消息长度不正确),则线程最多等待5秒钟以丢弃请求。
那么,是否可以仅为recv()
函数设置此超时而不影响accept()
函数?如果是这样,我该怎么做?
答案 0 :(得分:8)
SO_RCVTIMEO
选项仅影响您设置它的文件描述符 - 如果您在侦听套接字上设置它,它将使该套接字上的accept()
次调用超时;如果你在连接的套接字上设置它,它将使该套接字上的recv()
次调用超时。没有套接字可以同时调用accept()
和recv()
,因此不需要区分。
答案 1 :(得分:0)
是的,SO_RCVTIMEO将解决您的问题。但是,在这种情况下,如果您正在为多个客户端工作,则必须为每个客户端的每个套接字使用SO_RCVTIMEO。如果要避免这种情况,请使用select()函数并在select()调用上设置超时。 select()将以三种情况返回
所以使用select(),你不必担心连接多少客户端,超时后你可以重新开始。