我正在使用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
调用中设置的超时时间相互影响)?
谢谢,
答案 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]是EAGAIN
或EWOULDBLOCK
(达尔文对两者都使用相同的值,因此GNAT.Sockets
故意制作模糊的报告。)
答案 3 :(得分:0)
通过阅读Gnat.Sockets
软件包规范(顺便说一句,您链接到的软件包不支持Receive_Timeout
),我的猜测是Socket_Error
,它会解析(Resolve_Exception
})到Connection_Timed_Out
。
另一种可能性是Receive_Socket
返回Last
设置为Item'First - 1
,就像套接字被对等关闭一样。