2013-07-11 30 views
1

我正在使用Gnat Sockets软件包。 我已创建初始化与&一个服务器端的socket以下:如何检测与gnat.sockets.Receive_Socket读取套接字超时?

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(...); 

一切都很好SOFAR ,但是何时该使用:

GNAT.Sockets.Receive_Socket(...); 

我不知道如何检测套接字是否超时,或者在返回时读取一些数据。 我是否需要使用Check_Selector方法(对于此用途看起来有点沉重,如果是这样,它与在Set_Socket_Option调用中设置的超时进行交互)?

感谢,

+0

如果你使用套接字连接到一些外部系统,那么是的,你必须处理所有这些。但是,如果这是针对您正在开发的应用程序中的某些系统内通信,请参阅[ZeroMQ](http://www.zeromq.org/)([Ada binding](http:// www .zeromq.org/bindings:ada))或[YAMI4](http://www.inspirel.com/yami4)。它们为您处理所有详细的套接字内容,让您专注于所需的通信/消息协议。我已经尽可能地采用了ZeroMQ,并且我在开源开发中的目标是再也不用编写套接字代码:-) –

回答

2

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

我通常会将包括Check_Selector()调用在内的套接字读取放在任务中,以免阻塞应用程序的其余部分,并允许从外部启动Abort_Selector。实际上,我很少使用超时,只是在套接字上循环检查/读取,而当我不再需要读取套接字时(例如关闭时),只需调用Abort_Selector()即可完成。

+0

这看起来像要走的路。没有接受,直到它得到它的工作,虽然:) – NWS

0

我觉得我读有关使用异步select处理超时的情况下有人......是这样的:

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

Note:以上是从内存,不syntax-检查或编译。

+0

这看起来好像是在做'Receive_Socket'过程应该在内部做的事情。它可能会工作,但不是我正在寻找的'GNAT.Sockets'解决方案。 – NWS

+0

您正在考虑[异步转移控制](http://www.ada-auth.org/standards/12rm/html/RM-9-7-4.html)。它在Mac OS X的这种环境下工作,但我认为它不适用于检测套接字超时(取决于线程/任务/套接字之间的交互)。 –

0

我还没有试过这个,但它looks as though你应该得到一个Socket_Error例外,或许,EWOULDBLOCK

如果数据只是逐渐流过,这可能不会工作得太好,因为超时将在每次一些数据到达时被重置。

更新:我在Mac OS X上试过这个,并得到GNAT.SOCKETS.SOCKET_ERROR: [35] Resource temporarily unavailable。 [35]是EAGAINEWOULDBLOCK(达尔文对两者使用相同的值,所以GNAT.Sockets故意做出不明确的报告)。

0

通过阅读Gnat.Sockets包装规格(顺便说一句,一个你挂不支持Receive_Timeout),我的猜测是Socket_Error升高,解析(含Resolve_Exception)到Connection_Timed_Out

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

+0

正确的链接包,我猜维基百科还没有更新! – NWS

相关问题