我想展示到目前为止我的想法,并说现在我有一个客户端(订阅者),它连接并向服务器(订阅者和编辑者之间的中介)发送消息。
我有一个列表,其中存储订阅者可以订阅的每个主题,以及该列表中每个节点的订阅者列表。
截至目前,订阅者可以注册或退出某个主题。我现在的问题是通知主题的每个订阅者编辑器何时生成事件。
为了做到这一点,我想到了,我会浏览事件主题列表,并向该主题的每个订阅者发送一条消息,订阅者收到消息,他已收到通知。
但是要做到这一点,我现在能想到的唯一方法就是使用如下代码:
int sock_tcp;
struct sockaddr_in dir_tcp_srv;
sock_tcp=socket(AF_INET,SOCK_STREAM,0);
if(sock_tcp<0)
{
fprintf(stdout,"ERROR\n");
exit(1);
}
bzero((char*)&dir_tcp_srv,sizeof(struct sockaddr_in));
dir_tcp_srv.sin_family=AF_INET;
dir_tcp_srv.sin_addr.s_addr=inet_addr(address_previously_stored);
dir_tcp_srv.sin_port=htons(port_previously_stored);
if(connect(sock_tcp,
(struct sockaddr*)&dir_tcp_srv,
sizeof(struct sockaddr_in))<0)
{
perror("CONNECT error");
close(sock_tcp); exit(1);
}
例如,我将其放在一个函数上(这是我当前用于将订阅者连接到中间进程的代码),并为其提供两个参数,例如地址和端口,然后只需浏览列表,每次都调用此代码只是参数不同。
这对我来说似乎有点愚蠢,就像我错过了某种观点或概念,因为我一直使用相同的代码,这似乎有点浪费。我相信通过不同的实现,我可以进行某种广播,订阅者只会获取信息,但这是一种“推送”订阅者编辑器模式,所以我相信我的想法是适合该概念的(而不是从订阅者只要需要信息等等)。
最佳答案
TCP 是一种点对点协议(protocol),有两端且面向连接。 如果您坚持使用 TCP 作为通信机制,则必须迭代所有订阅者建立连接、发送和关闭的过程,因为 TCP 不是多播的。
如果您使用 UDP,那么您可以轻松地广播此内容,但即使如此,您仍会被限制在子网的边界内。
关于c - 在服务器/客户端 tcp 实现中向每个订阅者发送通知的不同方式/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29546026/