C# 多播数据包:发送和接收问题
在我改编的一些多播教程中,我改变了发送数据包的方法 在我的例子中,我创建了一个大小为C# 多播数据包:发送和接收问题,c#,multicastsocket,C#,Multicastsocket,在我改编的一些多播教程中,我改变了发送数据包的方法 在我的例子中,我创建了一个大小为字节[1024]的数据包队列,然后通过Socket.Send()通过所有在线网络适配器发送 问题: 发送时,另一个名为receiveMessage()的方法在单独的线程上运行。使用Socket.Bind(),它捕获数据包,但只捕获1个数据包 我是否做了太多的处理,从而延迟(和丢失)收到的数据包 更新 我正在考虑为传入的数据包添加一个队列,因此1个线程捕获并存储数据包,第二个线程处理数据包 发送方法 Socket
字节[1024]
的数据包队列,然后通过Socket.Send()
通过所有在线网络适配器发送
问题:
发送时,另一个名为receiveMessage()
的方法在单独的线程上运行。使用Socket.Bind()
,它捕获数据包,但只捕获1个数据包
我是否做了太多的处理,从而延迟(和丢失)收到的数据包
更新
我正在考虑为传入的数据包添加一个队列,因此1个线程捕获并存储数据包,第二个线程处理数据包
发送方法
Socket _listener_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
foreach (IPAddress localIP in Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork))
{
//handle image and files
_listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(_MultiIP, localIP));
_listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1);
_listener_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
_listener_socket.MulticastLoopback = true;
_listener_socket.Connect(new IPEndPoint(_MultiIP, _PORT));
int count = MSGS_TO_SEND.Count;
while (count > 0)
{
count--;
byte[] temp = (byte[])(MSGS_TO_SEND.Dequeue());
_listener_socket.Send(temp, _BYTE_BUFFER_SIZE, SocketFlags.None);
MSGS_TO_SEND.Enqueue(temp);
}
//----------------------------------------------
//-------------------SEND DATA------------------
//----------------------------------------------
}
_listener_socket.Close();
接收方法
//initialise multicast group and bind to interface
Socket _sender_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, _PORT);
_sender_socket.Bind(ipep);
IPAddress localip = _MultiIP;
_sender_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(localip, IPAddress.Any));
//{
while (_sender_socket.IsBound && !bStop)
{
byte[] b = new byte[_BYTE_BUFFER_SIZE];
_sender_socket.Receive(b);
char[] chars = new char[_BYTE_BUFFER_SIZE];
System.Buffer.BlockCopy(b, 0, chars, 0, b.Length);
string _message = new string(chars).Trim();
string ip = _message.Substring(0, _message.IndexOf("~"));
_message = _message.Remove(0, _message.IndexOf("~") + 1);
string _flag = _message.Substring(0, _message.IndexOf("~"));
_message = _message.Remove(0, _message.IndexOf("~") + 1);
_message = _message.Replace("\0", string.Empty);
ip = "1.0";
icount++;
handleData(ip, _flag, _message);
}
如果您不想尝试,下面是一个完全正常工作的示例:
您可以在项目中使用这些可重复使用的组件(
MulticastSender
,MulticastReceiver
,),前提是发件人不必绑定或添加成员资格。任何数据报套接字都可以发送到多播地址。接收方需要向多播地址添加成员身份。发送方和接收方还需要就端口达成一致意见(接收方应绑定到端口。)
每个示例中的多播选项的参数都是相反的
套接字已经具有来自内核的缓冲,因此您不需要使用消息队列使代码复杂化