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

时间:2018-06-07 01:10:58

标签: c sockets networking udp

我不熟悉套接字和网络编程,所以如果问题看起来很愚蠢,那是因为我不完全理解上述主题。

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

我的代码是用C编写的。

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

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

是否有人知道我所谈论的内容是否可行?如果是这样,我该怎么做?如果不是,那么还有其他方法吗,即不使用sockets

2 个答案:

答案 0 :(得分:4)

  

需要通过网络连续发送遥测数据。不太关心谁会得到它,只需要发送它。

嗯,您的发件人需要知道WHERE才能将数据发送到。

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

如果您不想以这种方式做事,您还有另外两种选择:

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

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

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

    您的接收方可以创建并setsockopt() UDP套接字到具有到发送方的网络路由的本地网络接口,然后使用IP_ADD_MEMBERSHIP将套接字加入多播组(使用{{1 }表示IPv4,IPV6_ADD_MEMBERSHIP表示IPv6),然后使用recvfrom()读取数据包(如果发送者recv() connect(),则使用</div> #39;事先知道IP。

  

所有客户端需要做的只是连接到特定的IP并从特定端口获取数据,并且数据将被接收。

我建议使用多播。您可以获得以下优势:能够在发送方端发送更少的数据包,并将它们同时通过网络传送到(可能)多个接收器,并通过将流量隔离到实际想要接收的各方来减少网络开销数据包。

答案 1 :(得分:1)

  

需要通过网络连续发送遥测数据。不关心谁会得到它,只需要把它发出去。

所以使用UDP。

  

所有客户端需要做的只是连接到特定的IP并从特定端口获取数据,并且数据将被接收。

所以使用UDP。只要有必要,请致电sendto()

  

最初我以为它是UDP套接字。

你是对的。

  

但它有recvfrom()方法

正确。

  

即。我(服务器)需要等到有人连接它。

不正确的。 recvfrom()等待某人向其发送,发件人不必等待。

  

然后我决定查看TCP / IP套接字,但这个方法有一个accept()方法。

正确。您必须将发件人设为服务器,使用listen(), accept(), send()等。我不建议您根据自己的需要使用此服务器。

如果您想拥有多个侦听器,请使用UDP多播。