我知道如何通过udp协议将字节数据发送到服务器。如何激活我发送的包裹上的一些标志?如果收到的包已激活某些标志,我该怎么办电话。此外,我如何读取包中包含的校验和?如果我想发送一个没有数据的包而只是一个标志我该怎么办?我想用c#做这个。我不想修改本地端点或远程端点,也不想修改每个包的任何其他内容。
我之所以这样做是因为我已经很努力地去做tcp打孔。我在forward traffic from port X to computer B with c# "UDP punch hole into firewall"打开了一个赏金问题,无论如何我设法做了udp打孔。因此,我想让udp可靠。
我知道创建它不会是eassy,但至少我想尝试一下。我花了很多时间找到一个这样做的c#库...
答案 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基本上做的)。