我过去做了很多UDP套接字编程,但只听说过通常保留的IP:
但是从IP2Location它说多播.是234.5.5.1实际的IP地址或保留?
我正在尝试使用UDP多播设置自动发现,并使用来自互联网的一些示例代码.这似乎当我运行在客户端和在同一台机器上的服务器工作正常,但是当我在不同的机器上运行它们,无论是与一机在虚拟机上运行我的机器(VirtualBox的)上或在其他"真正"的机器网络然后其他机器似乎永远不会收到正在广播的消息.
在一些谷歌搜索后,似乎可能的罪魁祸首将是路由器(SpeedTouch 780)可能正在丢弃数据包.我怎样才能检查是否是这种情况?他们可以检查其他事情以尝试追踪问题吗?可能完全是别的东西吗?
代码:
服务器代码
using System;
using System.Net.Sockets;
using System.Text;
internal class StockPriceMulticaster
{
private static string[] symbols = {"ABCD", "EFGH", "IJKL", "MNOP"};
public static void Main ()
{
using (UdpClient publisher = new UdpClient ("230.0.0.1", 8899))
{
Console.WriteLine ("Publishing stock prices to 230.0.0.1:8899");
Random gen = new Random ();
while (true)
{
int i = gen.Next (0, symbols.Length);
double price = 400*gen.NextDouble () + 100;
string msg = String.Format ("{0} {1:#.00}", symbols, price);
byte[] sdata = Encoding.ASCII.GetBytes (msg); …Run Code Online (Sandbox Code Playgroud) 我在创建MulticastSocket后尝试加入组播组.
做类似的事情:
MulticastSocket mySocket = new MulticastSocket(4444);
mySocket.joinGroup(InetAddress.getByName("230.0.0.1")); // as an example
Run Code Online (Sandbox Code Playgroud)
工作良好.但是,当我使用接受SocketAddress作为参数的MulticastSocket构造函数时,不会加入多播组,并且需要对joinGroup()进行单独调用.
MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
谢谢!
我实现了一个利用多播消息的网络发现过程.它允许发现具有连接到同一段的任何ip地址的特定设备.
客户端A发送多播消息,要求其他客户端.其他客户端使用多播消息"我在这里......"进行响应.基本上这很好用.
但有一个案例让我烦恼.
Client A Client B
192.168.2.5 192.168.2.5
| |
\__________ /
>>>
UDP Multicast Message:
Source: 192.168.2.5 | Destination: 224.0.0.150
Run Code Online (Sandbox Code Playgroud)
可能会出现一致,即发送多播消息的客户端A和客户端B都监听相同的IP地址.在这种情况下,UDP数据包的源地址与目标客户端的IP地址相同.因此,客户端B上的应用程序不接收任何多播消息.
我想具有相同消息的多播消息被阻塞并丢弃在ip-stack中.有没有办法(套接字设置)接收它.
我目前正在开发一个需要解码UDP多播RTSP流的应用程序.目前,我可以使用ffplay via查看RTP流
ffplay -rtsp_transport udp_multicast rtsp://streamURLGoesHere
Run Code Online (Sandbox Code Playgroud)
但是,我试图使用FFMPEG来打开UDP流(为了简洁起见,错误检查和清除代码被删除).
AVFormatContext* ctxt = NULL;
av_open_input_file(
&ctxt,
urlString,
NULL,
0,
NULL
);
av_find_stream_info(ctxt);
AVCodecContext* codecCtxt;
int videoStreamIdx = -1;
for (int i = 0; i < ctxt->nb_streams; i++)
{
if (ctxt->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStreamIdx = i;
break;
}
}
AVCodecContext* codecCtxt = ctxt->streams[videoStreamIdx]->codec;
AVCodec* codec = avcodec_fine_decoder(codecCtxt->codec_id);
avcodec_open(codecCtxt, codec);
AVPacket packet;
while(av_read_frame(ctxt, &packet) >= 0)
{
if (packet.stream_index == videoStreamIdx)
{
/// Decoding performed here
...
}
}
...
Run Code Online (Sandbox Code Playgroud)
这种方法适用于由原始编码视频流组成的文件输入,但对于UDP多播RTSP流,它无法执行任何错误检查av_open_input_file().请指教...
我必须实现一个多播接收器,它能够加入一个多播组列表,并使用boost在特定线程中处理接收到的数据.我确实尝试了以下代码.....
boost::asio::io_service m_io_service;
boost::asio::ip::udp::socket m_multicast_socket(m_io_service);
// listen address
boost::asio::ip::address listen_address
= boost::asio::ip::address::from_string("0.0.0.0");
// listen port
unsigned short multicast_port = m_configuration->m_multicast_interface_port;
boost::asio::ip::udp::endpoint listen_endpoint( listen_address, multicast_port );
// open socket
m_multicast_socket.open( listen_endpoint.protocol() );
// set socket buffer size
m_multicast_socket.set_option(
boost::asio::ip::udp::socket::receive_buffer_size
( m_configuration->m_receiving_socket_buffer_size ) );
// other sockets could bind to listen_address
m_multicast_socket.set_option( boost::asio::ip::udp::socket::reuse_address(true) );
boost::asio::socket_base::bytes_readable num_of_bytes_readable(true);
m_multicast_socket.io_control(num_of_bytes_readable);
m_multicast_socket.bind(listen_endpoint);
// joining a list of multicast group
for ( size_t i=0; i < multicast_groups.size(); ++i )
{
boost::asio::ip::address multicast_address
= boost::asio::ip::address::from_string( multicast_groups[i] );
m_multicast_socket.set_option( …Run Code Online (Sandbox Code Playgroud) 我是golang编程和多播编程的新人.我在https://gist.github.com/fiorix/9664255上看到了一个关于golang组播的程序.
import (
"encoding/hex"
"log"
"net"
"time"
)
const (
srvAddr = "224.0.0.1:9999"
maxDatagramSize = 8192
)
//send multicast data
func ping(a string) {
addr, err := net.ResolveUDPAddr("udp", a)
if err != nil {
log.Fatal(err)
}
c, err := net.DialUDP("udp", nil, addr)
for {
c.Write([]byte("hello, world\n"))
time.Sleep(1 * time.Second)
}
}
//print received data
func msgHandler(src *net.UDPAddr, n int, b []byte) {
log.Println(n, "bytes read from", src)
log.Println(hex.Dump(b[:n]))
}
//join multicast group and receive multicast data
func serveMulticastUDP(a …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我运行的每个组播示例(计算机运行OpenSUSE Linux)都可以运行.客户都只是静静地坐着.如何找出阻止/忽略多播的原因?
一些例子:
http://www.roseindia.net/java/example/java/net/udp/UDPMulticastServer.java
http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html (使用这些文件:) http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServer.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServerThread.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastClient.java http:// docs.oracle.com/javase/tutorial/networking/datagrams/examples/one-liners.txt
multicast ×8
udp ×3
java ×2
linux ×2
networking ×2
sockets ×2
boost-asio ×1
c# ×1
c++ ×1
ffmpeg ×1
go ×1
ip ×1
ip-address ×1