如何使用GNAT.sockets管理客户端连接?

时间:2014-02-04 17:19:16

标签: ada

这是一个聊天客户端/服务器程序。要进行广播,我必须保存每个连接的客户端,然后写入每个客户端,我是对的吗?管理客户的最佳做法是什么?

    GNAT.Sockets.Accept_Socket(
         Server  => Receiver,
         Socket => Connection,
        Address => Client
    );
    Channel := GNAT.Sockets.Stream(Connection);
    String'Write(Channel, "Welcome Message");

2 个答案:

答案 0 :(得分:3)

我认为您可以先使用GNAT.Sockets.Socket_Set_Type来保存感兴趣的套接字,即服务器套接字和所有当前连接的客户端套接字。

使用GNAT.Sockets.Check_Selector等待可读事件发生,然后GNAT.Sockets.Get找到相关的套接字(或其中一个套接字);如果它是服务器套接字,则新客户端已连接,否则其中一个现有客户端具有要读取的输入。

我在Embedded Web Server中有一个这种方法的例子;但请注意,这并不涉及其中一个客户端响应速度太慢而写入被阻止的情况。从这种情况中恢复会更复杂。

答案 1 :(得分:2)

是的,您必须写信给每个客户。虽然有多播套接字可以为你处理一些问题。

管理客户的最佳做法是让其他人为您做。

我厌倦了反复编写套接字代码,所以我只是采用了ZeroMQ并编写了TOMI_4_Ada来管理所有客户端/服务器,pub / sub细节。

还有其他Ada友好协议,如YAMI4,也是如此。