这是一个聊天客户端/服务器程序。要进行广播,我必须保存每个连接的客户端,然后写入每个客户端,我是对的吗?管理客户的最佳做法是什么?
GNAT.Sockets.Accept_Socket(
Server => Receiver,
Socket => Connection,
Address => Client
);
Channel := GNAT.Sockets.Stream(Connection);
String'Write(Channel, "Welcome Message");
答案 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,也是如此。