我不熟悉套接字和网络编程,所以如果问题看起来很愚蠢,那是因为我不完全理解上述主题。
需要通过网络连续发送遥测数据。真的不在乎谁会得到它,只需要将它发送出去。客户端需要做的只是连接到特定的IP并从特定端口获取数据,并且数据将被接收。
我的代码是用C
编写的。
最初我以为它是UDP套接字。但它有recvfrom
方法,即我(服务器)需要等到有人连接它。然后我决定查看TCP / IP套接字,但这个方法有一个accept
方法。
我在网上看了很长时间,但没有找到任何可以帮助我的代码(也许我在找错了地方)。
是否有人知道我所谈论的内容是否可行?如果是这样,我该怎么做?如果不是,那么还有其他方法吗,即不使用sockets
?
答案 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多播。