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

C# 使用c获取并设置udp包标志和校验和#,c#,networking,udp,package,C#,Networking,Udp,Package,我知道如何通过udp协议向服务器发送字节数据。如何激活正在发送的包上的某些标志?如果收到的包激活了某些标志,我如何告知。此外,如何读取包中包含的校验和?如果我想发送一个没有数据、只有一个标志的包,我该怎么做?我想用c做这个。我不想修改本地端点、远程端点或每个包的任何其他内容 编辑 我之所以想这样做,是因为我一直在努力做tcp打孔。不管我怎么做,我都会提出一个悬赏问题。因此,我希望使udp可靠 换句话说,我想创建一个算法,使我能够以正确的顺序将udp包发送到目的地。如果我可以打开并读取一些标志,那

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

编辑 我之所以想这样做,是因为我一直在努力做tcp打孔。不管我怎么做,我都会提出一个悬赏问题。因此,我希望使udp可靠

换句话说,我想创建一个算法,使我能够以正确的顺序将udp包发送到目的地。如果我可以打开并读取一些标志,那么这将促进这个算法。
我知道创建它并不容易,但至少我想尝试一下。我花了很多时间寻找一个c#library来实现这一点…

老实说,我认为要解决这个问题,要让TCP方面的东西发挥作用将是一件困难的事情,因为TCP是为满足你的要求而设计的,所以我个人会采取“正确的工具,适合正确的工作”的方法

也就是说

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

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

你需要你的数据,并且必须以某种方式进行包装,比如定义数据包开始的字节,然后可能是数据,或者一些标志等等

我会研究一些数据结构,比如TLV(很多智能卡都使用)——TLV代表标记长度值,因此可能表示如下内容:

    0x10 0x04 0x01 0x02 0x03 0x04
其中,命令代码0x10可能意味着更新ticker,0x04-要跟随的4字节数据。。。然后是4字节的数据

至于标志和校验和,那么标志很容易,你可以在一个字节中得到8个,只需使用和掩码翻转它们

    0x00 AND 0x01 = 0x01
    0x01 AND 0x80 = 0x81
校验和有点难,但这取决于你需要的准确度。本质上,校验和是一种数学算法,它使用数据的内容来创建一些神奇的数字,这些数字可以在接收端轻松计算出来

这可能很简单,将所有值相加,然后将结果与某个幻数相加,然后在发送字节之前将其添加到数据包的末尾

然后在接收端执行同样的操作,并比较结果

当然,如果你真的不想走这种包装、协议和爵士乐的路线,那么你可以从过去糟糕的串行通信中吸取教训

XModem、ZModem、Kermit、YModem等的开源实现还有很多,因为其中大多数都可以(而且确实)处理字节流,那么,让它们在UDP上使用字节流而不是在串行端口上使用字节流应该不会太困难。

UDP已经有了一个

你是不是想问类似的问题?这允许您保证数据包的交付和订购(两者都有、都没有或两者都有)。实现可靠的UDP协议


如果你想自己滚,读一读如何滚;并通过UDP(Lidgren基本上就是这么做的)模拟这种情况。

我很惊讶,您要么必须使用windows XP上现在限制的原始套接字,要么创建自己的包含序列号和校验和以及实际数据的协议。非常感谢。听起来很有趣。是的,我想你是对的。。。我必须创建我的标志,并用我发送的字节检查总和。我不知道你们提到的很多事情,但我想你们解释得很好。所以我相信现在我必须在字节级别发送ckeck和。我计划发送一个正的int32作为校验和,假设有8个可能的标志,因此这意味着如果我做的数学正确,我必须发送5字节的数据,用于我计划发送的每件事情,对吗?然后,另一方将前5个字节视为头infoYup,这很有意义。您只需记住,无论您如何决定,都要彻底记录它,以便接收方知道如何处理它。@shawty,假设我需要发送1024字节的数据。我将把前5个字节(我的头)放在数组前面,给我一个长度为1029的数组。当我发送长度为1029的字节数组时,它会分成两个包吗?我的意思是,我必须将最初的1024个数组分为两个数组,每个数组有512字节,并在每个数组中放置一个头吗?我的意思是,我应该多久放置一次头(添加前5个字节)?是的,它会在数据包大小边界上分割数据包,但作为应用程序级程序员,您不必担心这一点。尽管UDP缺少TCP所具有的控制,但数据包仍然由连接两端的网络堆栈拆分和重新组装。如果您希望在传输级别上施加控制,那么这里讨论的任何内容都不会对您有任何好处,您将需要使用纯TCP和简单TCP。如果您需要深入了解,请查阅“ISO 7层协议图”@Jonathan true有几个库可以完成我正在尝试的工作。我也发现了一些,但在c#上很少。我在c#上找不到一个有效的。也许我做错了什么。我宁愿使用一个已经运行的库。因为我还不能使其中一个工作,我将开始自己的工作。如果你找到一个,给我看一个基本的例子,我会非常感激。@Tono Lidgren G3内置了NAT打孔。我也做了