c - 在服务器/客户端 tcp 实现中向每个订阅者发送通知的不同方式/方法

标签 c sockets tcp publish-subscribe

我想展示到目前为止我的想法,并说现在我有一个客户端(订阅者),它连接并向服务器(订阅者和编辑者之间的中介)发送消息。

我有一个列表,其中存储订阅者可以订阅的每个主题,以及该列表中每个节点的订阅者列表。

截至目前,订阅者可以注册或退出某个主题。我现在的问题是通知主题的每个订阅者编辑器何时生成事件。

为了做到这一点,我想到了,我会浏览事件主题列表,并向该主题的每个订阅者发送一条消息,订阅者收到消息,他已收到通知。

但是要做到这一点,我现在能想到的唯一方法就是使用如下代码:

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/

相关文章:

c++ - 如何只用一个#define 定义两个或多个值?

perl(良好实践): lexical filehandle for socket

C++ HTTP GET 请求问题?

java - TCP 服务器 Java 与 PHP

c - 如何从 C 程序读取 .txt 文件或 .csv 文件?

c - 如何改变C中数组的大小?

C++ UDP 双向客户端/服务器传送

c# - 我如何根据它们传播的客户端应用程序实例对套接字连接进行分组?

c++ - 在不关闭 native 处理程序的情况下销毁 Boost Asio 套接字

c - 可移植地将二进制补码整数写入内存的算法