c#:如何安全地发送组播数据包而不受干扰?

时间:2017-10-02 17:43:32

标签: c# .net sockets networking multicast

很抱歉,如果标题很难理解,但我真的不知道该怎么说。让我解释一下。

我目前正在开发一个局域网文件共享大学项目。 运行该应用程序的每个人都必须通知其他人他们可以进行文件传输。我的想法是在启动时加入多播组,并在多播中发送一种“保持活动”的数据包:保持活动我的意思是这个数据包会告诉所有接收者发送者仍可用于传输文件,如果其他用户想要。例如:我正在运行应用程序,它将每50秒左右发送一次此数据包,运行我的应用程序的网络中的其他人将收到此数据包并将我留在他们的记忆中。

这是客户端所做的事情(这只是一个示例,而不是实际代码),在应用程序的这一点上,我已加入多播组并设置目标端点:

//   Sending first data, e.g.: my ip address...
client.Send(buffer, buffer.Length, MulticastAddressEndPoint);

//   Sending other data, e.g.: my real name...
client.Send(buffer2, buffer2.Length, MulticastAddressEndPoint);

//   Sending other data, e.g.: my username...
client.Send(buffer3, buffer3.Length, MulticastAddressEndPoint);

从官方文档中我读到了发送:

  

将UDP数据报发送到指定远程端点的主机。

所以我猜测发送 3 数据报。

我的监听线程是这样的:

IPEndPoint from = new IPEndPoint(IPAddress.IPv6Any, port);

while(true)
{
    //  Receive the ip
    byte[] data = client.Receive(ref from);

    //  Receive the first name
    data = client.Receive(ref from);    

    //  Receive the username
    data = client.Receive(ref from);    
}

现在提出真正的问题: 假设有两个人在同一时间发送这3个数据包(当然是它们的值,因此不同的IP地址等),并且没有丢弃数据包并且它们以正确的顺序传送(首先是ip,然后是名字,用户名)。问题是:我绝对 NO 保证我将按此顺序接收数据包:

  

packet1_A | packet2_A | packet3_A | packet1_B | packet2_B | packet3_B

而不是

  

packet1_A | packet1_B | packet2_A | packet2_B | packet3_A | packet3_B

我是对的吗? 我能做的唯一事情是将所有信息打包在一个单字节数组中,然后发送它,对吧?这似乎是最合理的事情,但如果我的信息超过以太网的1500字节怎么办?我的数据报将以更多数据包发送,因此我会遇到相同的“干扰”,或者我的NIC会检测属于同一数据报的数据包并再次加入它们然后将其传送到操作系统?

0 个答案:

没有答案