【发布时间】:2018-01-16 15:56:02
【问题描述】:
我有一台带有 C 代码的 linux 计算机,它必须通过 UDP 与 4 个不同的设备进行通信。计算机向每个设备发送不同的命令并接收响应,有时是并行的......
我是一个完美的初学者,并设法使用 UDP 套接字与一台设备进行通信。但是现在,我正在寻找一种与所有这些设备进行通信的方法,我想称之为“多插座”,但我不知道在哪里看/搜索什么词来找到一种方式......
我的 linux 电脑是客户端和所有设备服务器。我的电脑只有一个 eth 端口,必须使用交换机才能访问所有设备。我想创建如下功能:
sendcmd(IPnumber, PORTnumber, cmd , ...)
readbuff(IPnumber, PORTnumber, buff, ...)
所以我可以选择哪个 IP 将接收 cmd ...我不知道这是否可能或者我是否需要打开套接字,然后关闭并使用另一个 IP 重做操作...
那么,如果我设法让自己被理解,我应该在哪里寻找解决问题的方法?
谢谢!
【问题讨论】:
-
处理多个连接的方法有很多。您可以使用多个进程,每个进程有一个“连接”。或线程而不是进程。或使用四个(在您的情况下)套接字将数据发送到每个套接字,然后使用例如
select或类似的轮询函数来检查正在接收的数据以及来自哪个套接字。 -
如果您向所有节点发送完全相同的数据,您可以查看多播。
-
使用 UDP,
sendto/recvfrom就是您要找的。单个套接字可以与任意数量的端点通信。 -
@user58697 当我使用时:
sendto(socket_fd , cmd_final, BUFFLEN , 0 , (struct sockaddr *)&serv_addr, serv_len)定义我的 IP 和端口的唯一部分是serv_addr,因为我之前使用:serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.s_addr = inet_addr("INADDR_ANY")和:inet_pton(AF_INET, SERVER, &serv_addr.sin_addr);定义它所以我需要创建多个struct sockaddr_in serv_addr以选择如下IP/PORT?sendto( ... (struct sockaddr *)&serv_addr_**i** ...)是吗?谢谢!