我正在使用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
调用中设置的超时交互)吗?
谢谢
最佳答案
无论如何,Check_Selector 上的 Timeout 参数都会按照您的意愿执行。您调用 Check_Selector(),并在它返回时查看状态。如果状态为完成,则您已获得“事件”,例如数据(假设您正在读取)或套接字的另一端关闭,如果已过期,则选择器超时,如果已中止,则选择器被命令提前终止通过 Abort_Selector()。
我通常将套接字读取(包括 Check_Selector() 调用)放在任务中,以免阻塞应用程序的其余部分,并允许外部启动 Abort_Selector。事实上,我很少使用超时,我只是在套接字上循环检查/读取,当我不再需要读取套接字时,例如关闭时,只需调用 Abort_Selector() 来完成它。
关于sockets - 如何使用 gnat.sockets.Receive_Socket 检测套接字读取超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603978/