如何使用gnat.sockets.Receive_Socket检测套接字读取的超时?

时间:2013-07-11 21:38:19

标签: sockets ada gnat

我正在使用Gnat Sockets包。 我有一个已创建的服务器端插槽&初始化如下:

   GNAT.Sockets.Create_Socket(...);

...

   GNAT.Sockets.Set_Socket_Option
     (Socket => Server,
      Option => (Name => GNAT.Sockets.Receive_Timeout,
                 Timeout => Listner_Timeout));

...

   GNAT.Sockets.Listen_Socket(...);
   GNAT.Sockets.Accept_Socket(...);

一切都很好,但是在适合的时候使用:

   GNAT.Sockets.Receive_Socket(...);

我不知道如何检测我的套接字是否超时,或者在返回时读取一些数据。 我是否需要使用Check_Selector方法(对于此用途来说似乎有点沉重,如果这样做会与Set_Socket_Option调用中设置的超时时间相互影响)?

谢谢,

4 个答案:

答案 0 :(得分:2)

在任何情况下,Check_Selector上的Timeout参数都会执行您想要的声音。您调用Check_Selector(),并在返回时查看状态。如果状态为完成,您已经获得了“活动”,例如数据(假设您正在读取)或套接字的另一端关闭,如果Expired选择器超时,如果已中止,则命令选择器提前终止通过Abort_Selector()。

我通常将套接字读取(包括Check_Selector()调用)放在任务中,以便不阻止应用程序的其余部分,并允许外部启动的Abort_Selector。事实上,我很少使用超时,我只是在套接字上循环检查/读取,当我不再需要读取套接字时,就像关闭时一样,只需调用Abort_Selector()来完成它。

答案 1 :(得分:0)

我想我读到有人使用异步select来处理超时情况......类似于:

loop
  select
    -- HANDLE SOCKET RECEPTION
   or
    delay 7.0; -- Wait seven seconds to timeout.
  end select;
end loop;

Note:以上内容来自内存,未进行语法检查或编译。

答案 2 :(得分:0)

我没有尝试过这个,但是looks as though你应该Socket_Error例外EWOULDBLOCK

如果数据只是逐渐流过,这可能效果不好,因为每次某些数据到达时都会重置超时。

更新:我在Mac OS X上试过这个,得到了GNAT.SOCKETS.SOCKET_ERROR: [35] Resource temporarily unavailable。 [35]是EAGAINEWOULDBLOCK(达尔文对两者都使用相同的值,因此GNAT.Sockets故意制作模糊的报告。)

答案 3 :(得分:0)

通过阅读Gnat.Sockets软件包规范(顺便说一句,您链接到的软件包不支持Receive_Timeout),我的猜测是Socket_Error,它会解析(Resolve_Exception })到Connection_Timed_Out

另一种可能性是Receive_Socket返回Last设置为Item'First - 1,就像套接字被对等关闭一样。