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

标签 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 调用中设置的超时交互)吗?

谢谢

最佳答案

无论如何,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/

相关文章:

vim - 尝试从标签文件打开引用时,如何告诉 vim 搜索某个目录(以及当前目录)?

ada - 比较标记类型

C# Networkstream 不读取任何内容

android - 在应用程序处于前台时保持 android 服务处于 Activity 状态

java - 是否有关于使用套接字与 Google App Engine for Java 服务进行客户端/服务器连接的教程?

java - PHP Socket Java 消息交换

matrix - Ada 中的 HowTo 和多维矩阵

ada - Ada 中的 Get_line

exception - "should"时未引发 Ada CONSTRAINT_ERROR

xcode - 如何在 Mac 上编译/构建 Ada?