使用c#获取并设置udp包标志和校验和

时间:2011-09-07 03:54:56

标签: c# networking udp package

我知道如何通过udp协议将字节数据发送到服务器。如何激活我发送的包裹上的一些标志?如果收到的包已激活某些标志,我该怎么办电话。此外,我如何读取包中包含的校验和?如果我想发送一个没有数据的包而只是一个标志我该怎么办?我想用c#做这个。我不想修改本地端点或远程端点,也不想修改每个包的任何其他内容。

修改

我之所以这样做是因为我已经很努力地去做tcp打孔。我在forward traffic from port X to computer B with c# "UDP punch hole into firewall"打开了一个赏金问题,无论如何我设法做了udp打孔。因此,我想让udp可靠。

换句话说,我想创建一个算法,使我能够以正确的顺序发送udp包到达目的地。如果我可以设置并读取一些标志,那么这将有助于此算法。

我知道创建它不会是eassy,但至少我想尝试一下。我花了很多时间找到一个这样做的c#库...

2 个答案:

答案 0 :(得分:1)

老实说,我认为将TCP问题解决这个问题只是一个难以解决的问题,而且由于TCP的目的是按照你的要求进行,所以我个人会采取“正确的工具,正确的工作“方法。

那说......

如果你真的必须使用UDP,那么你可以忘记在协议级别添加任何内容,底层传输层将忽略它。

相反,您必须设计自己的字节级协议(几乎可以追溯到RS232和串行通信的时代......)

你需要你的数据,而且必须以某种方式包装,比如说一个定义数据包开始的字节,然后是数据,或者一些标志......等等。

我会看看TLV等数据结构(很多智能卡使用) - TLV代表Tag-Length-Value,所以可能代表如下:

    0x10 0x04 0x01 0x02 0x03 0x04

其中命令代码0x10可能意味着更新自动收报机,0x04 - 要跟随的4个字节数据......然后是4个字节的数据。

对于标志和校验和,井标很容易,你可以在一个字节中得到8个,然后用AND掩码翻转它们。

    0x00 AND 0x01 = 0x01
    0x01 AND 0x80 = 0x81

检查总和有点困难,但这实际上取决于您需要的准确度。本质上,校验和是某种数学算法,它使用数据内容创建一些可以在接收端轻松计算的神奇数字。

这可能就像将所有值加在一起然后将结果加上一些幻数一样简单,然后在发送字节之前将其添加到数据包的末尾。

然后在接收端做同样的事情并比较结果。

当然,如果你真的不想沿着这条包装路线走下去,做自己的协议和所有爵士乐,那么你可以从连续通信的糟糕时期中吸取教训。

仍然有很多开源实现的东西,比如XModem,ZModem,Kermit,YModem以及其他许多仍然存在的东西,因为大多数这些都可以(并且确实)使用字节流,那么它应该不会太难使它们通过UDP使用字节流而不是串行端口上的字节流。

答案 1 :(得分:1)

UDP已经有checksum

您是否想询问RUDP之类的内容?这允许您保证数据包传送和排序(两者,无,或者任何一个)。 Lidgren实现了可靠的UDP协议。

如果你想自己动手,请阅读SEQ and ACK work in TCP的方法;并通过UDP模仿(这是Lidgren基本上做的)。