在不使用 recvfrom 或 accept 的情况下从特定的 ip 和端口发送网络流量

send network traffic to from a specific ip and port without using recvfrom or accept

我是套接字和网络编程的新手,所以如果这个问题看起来很愚蠢,那是因为我没有完全理解上述主题。

需要通过网络持续发送遥测数据。真的不在乎谁会得到它,只需要将它发送出去即可。客户端需要做的只是简单地连接到一个特定的 IP 并从一个特定的端口获取数据,数据将被它接收。

我的代码写在C.

本来以为是UDP套接字。但它有 recvfrom 方法,即我(服务器)需要等到有人连接到它。然后我决定查看 TCP/IP 套接字,但这个有一个 accept 方法。

我在网上找了一段时间,但没有找到任何可以帮助我的代码(也许我找错地方了)。

有谁知道我所说的是否可行?如果是这样我会怎么做?如果不是,那么还有其他方法可以做到吗,即不使用 sockets?

Need to continuously send telemetry data over a network. Don't really care who is going to get it, just need to send it out.

所以使用UDP。

All the client needs to do is simply to connect to a specific IP and get data from a specific port and the data will be received by it.

所以使用UDP。只要有需要就打电话给sendto()

Originally I thought it would be a UDP socket.

你是对的。

But it has recvfrom() method

正确。

i.e. I (server) need to wait till someone connects to it.

不正确。 recvfrom() 等到有人 发送 给它,发件人根本不需要等待。

Then I decided to look at TCP/IP socket but this one has an accept() method.

正确。你必须让你的发件人成为服务器,使用 listen(), accept(), send(),等等。我不建议你这样做。

如果要有多个侦听器,请使用 UDP 多播。

Need to continuously send telemetry data over a network. Don't really care who is going to get it, just need to send it out.

嗯,您的发件人需要知道将数据发送到哪里。

通常,接收方会先向您的发送方发送请求,这样它就知道接收方存在,然后您的发送方就会知道将数据包发送到哪里。但是,这需要您的发送方跟踪所有接收方,以便它可以单独向每个接收方发送单独的数据包。为此可以使用 UDP 或 TCP。

如果您不想那样做,您还有两个选择:

  • 子网广播(仅适用于 IPv4)- 您的发件人可以创建 UDP 套接字,然后使用 setsockopt() 启用 SO_BROADCAST 选项,然后 sendto() 数据包到给定子网的广播 IP 地址(或者使用 send() 如果它预先 connect() 到广播 IP)。发送的每个数据包将自动传送到连接到同一子网的每台 机器(无论这些机器是否需要数据包)。

    然后您的接收者可以创建并 bind() 一个 UDP 套接字到连接到同一子网的本地网络接口,然后使用 recvfrom() 读取数据包(或使用 recv() 如果它 connect() 预先发送到发件人的 IP 地址)。

  • 多播(同时适用于 IPv4 和 IPv6)- 您的发送方可以创建一个 UDP 套接字,然后 sendto() 数据包发送到 IP 地址给定多播组的(或者使用 send(),如果它预先 connect() 到多播组 IP)。每个数据包将发送给加入同一组的接收者。

    您的接收者可以创建并 bind() 一个到本地网络接口的 UDP 套接字,该接口具有到发送方的网络路由,然后使用 setsockopt() 将套接字加入多播组(使用 IP_ADD_MEMBERSHIP 用于 IPv4,IPV6_ADD_MEMBERSHIP 用于 IPv6),然后使用 recvfrom() 读取数据包(或者使用 recv() 如果它 connect() 到发件人的 IP事先)。

All the client needs to do is simply to connect to a specific IP and get data from a specific port and the data will be received by it.

我建议为此使用多播。您获得的好处是能够在发送方发送更少的数据包,并通过网络将它们同时传递给(可能)多个接收方,并且通过将流量隔离到仅真正想要接收的各方来减少网络开销数据包。