我有一个字节数组,代表一个完整的TCP/IP数据包.为了澄清,字节数组的排序如下:
(IP标头 - 20字节)(TCP标头 - 20字节)(有效负载 - X字节)
我有一个Parse接受字节数组并返回一个TCPHeader对象的函数.它看起来像这样:
TCPHeader Parse( byte[] buffer );
Run Code Online (Sandbox Code Playgroud)
给定原始字节数组,这是我现在调用此函数的方式.
byte[] tcpbuffer = new byte[ 20 ];
System.Buffer.BlockCopy( packet, 20, tcpbuffer, 0, 20 );
TCPHeader tcp = Parse( tcpbuffer );
Run Code Online (Sandbox Code Playgroud)
有没有一种方便的方法可以将TCP字节数组(即完整TCP/IP数据包的字节20-39)传递给Parse函数,而无需先将其提取到新的字节数组?
在C++中,我可以执行以下操作:
TCPHeader tcp = Parse( &packet[ 20 ] );
Run Code Online (Sandbox Code Playgroud)
C#中有类似的东西吗?我想尽可能避免临时字节数组的创建和后续垃圾收集.
我正在查看System.Collections.Generic.List <T>的开源代码.该AddRange(IEnumerable<T>)方法如下所示:
public void AddRange(IEnumerable<T> collection) {
Contract.Ensures(Count >= Contract.OldValue(Count));
InsertRange(_size, collection);
}
Run Code Online (Sandbox Code Playgroud)
这些InsertRange(int, IEnumerable<T>)方法看起来像这样:
public void InsertRange(int index, IEnumerable<T> collection) {
if (collection==null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
}
if ((uint)index > (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index);
}
Contract.EndContractBlock();
ICollection<T> c = collection as ICollection<T>;
if( c != null ) {
int count = c.Count;
if (count > 0) {
EnsureCapacity(_size + count);
if (index < _size) {
Array.Copy(_items, index, _items, index + count, _size - index); …Run Code Online (Sandbox Code Playgroud) 如果我的术语有点偏离,请原谅我.我对托管C++/CLI的了解非常有限.
我有一个MFC应用程序使用启用了/ clr选项的DLL.这个dll使用几个C#dll与使用WCF的服务器通信.在大多数情况下,这工作正常.
在C#的DLL中的一个,我已经添加扩展方法的System.Net.IPAddress类,将检索的对象的IPAddress子网掩码(使用UnicastIPAddressInformation类及其IPv4Mask).扩展方法在C#方面运行良好,但我无法弄清楚如何在托管C++/CLI代码中使用它.
首先,这甚至可能吗?如果是这样,托管C++/CLI端的语法是什么样的?我必须使用/ clr:pure选项才能使用吗?
以下是扩展方法的示例:
using System.Net;
using System.Net.NetworkInformation;
public static class IPAddressExtensions
{
public static IPAddress GetSubnetMask(this IPAddress address)
{
UnicastIPAddressInformation addressInfo = address.GetAddressInformation(); // elided
return ((addressInfo != null) ? addressInfo.IPv4Mask : null);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的托管C++代码中,如果可能的话,我将如何使用此扩展方法?
unsigned long bytes= 0x010000FF; // example address - 127.0.0.1
IPAddress^ address = gcnew IPAddress(BitConverter::GetBytes(bytes));
IPAddress^ subnet = address->GetSubnetMask(); // how do I do this???
Run Code Online (Sandbox Code Playgroud) 我有两个线程,一个将对象放入一个通用List集合的生产者线程和一个将这些对象从同一个通用List中拉出的消费者线程.我已经使用lock关键字正确地同步了对集合的读取和写入,并且一切正常.
我想知道的是,如果没有先锁定集合就可以访问Count属性.
JaredPar将他博客中的Count属性称为可导致竞争条件的决策程序,如下所示:
if (list.Count > 0)
{
return list[0];
}
Run Code Online (Sandbox Code Playgroud)
如果列表中有一个项目,并且在访问Count属性之后但在索引器之前删除了该项目,则会发生异常.我明白了.
但是,可以使用Count属性来确定初始大小是一个完全不同的集合吗?在MSDN文档说,实例成员不能保证线程安全的,所以我应该只是访问Count属性之前锁定集合?
我找不到成功运行的Hello World程序的exe文件,并且程序在它说它工作后就没有打开.我尝试去我的文档并检查我的项目文件夹.它完全是空的.感谢您的帮助.
我有一个 Windows 服务,它代表使用单独的前端 UI 配置该服务的登录用户执行一些与网络相关的操作。UI和Windows服务使用socket接口进行通信,即UI向服务发送命令,服务向UI发送数据进行处理/显示。这种设置已经为我们工作了很多年。
最近,安全策略强制要求我们的 Windows 服务不能再作为LocalSystem运行,而必须作为LocalService运行。在大多数情况下,这是一个平静的变化。然而...
Windows 服务功能的一部分是在用户指定的位置创建日志文件并将数据写入该日志文件,直到用户告诉其停止。如果用户指定 C:\ 级别的目录(例如C:\MyLogs),则 Windows 服务可以正常工作。但是,如果用户在她的 MyDocuments 文件夹中指定一个目录(例如,C:\Users\<username>\Documents\MyLogs),则 Windows 服务将失败,并显示System.UnauthorizedAccessException :
对 <位置> 的访问被拒绝。
我花了一段时间,但我终于明白作为 LocalService 运行的 Windows 服务无法访问登录用户的配置文件文件夹,例如 MyDocuments、AppData 等。
有解决方法吗?
我想到了几个选项,但由于我并不精通 Windows 安全性,因此我的 Google 忍者技能非常薄弱,因为我不确定要搜索什么。这是我的几个具体问题。我希望社区能够提供任何指导。
有人可以解释为什么.Net框架团队决定没有订阅者的委托应该是null而不是具有空InvocationList的对象吗?我想知道导致这一决定的理由.
void DoSomething()
{
EventHandler handler = SomeEvent;
if(handler != null) //why is this null-check necessary?
{
handler(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
似乎没有办法在两个字节上使用C#的三元运算符,如下所示:
byte someByte = someBoolean ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)
该代码当前无法使用"无法将源类型'int'转换为目标类型'byte'"进行编译,因为编译器将这些数字视为整数.显然没有指定的后缀表示0和1是字节,所以唯一的解决方法是(a)将结果转换为字节或(b)使用if-else控件.
有什么想法吗?
我需要一个强大的,用户友好的,专业的.NET WinForms IP地址控件,用于我正在进行的项目中.此控制至少应支持IPv4寻址,理想情况下也支持IPv6寻址.我更喜欢使用C#源代码进行免费控制,但不介意付费.
我使用的是.NET 3.5 SP1,因此.NET 2.0及更高版本应该足够了.
欢迎任何和所有建议.谢谢.
我工作的项目基本上是一个数据收集器.通过定向,可以将其视为具有应用层(OSI第7层)的解析/分析功能的Wireshark(或等效物).目前的版本是传统的MFC应用程序,已有15年以上的时间.它仍然有效,但维护,稳定性和可扩展性是我们面临的真正问题.项目领导团队最近同意我们需要开始开发下一代产品,我们的目标是.NET,因为该产品严格来说是基于Windows桌面的产品.
鉴于我们的用户经常分析世界各地收集的日志文件,因此消息时间戳非常重要.当前产品用于_ftime_s()分配时间戳,我假设我们只是用来System.DateTime.UtcNow在.NET端获取未来的时间戳.也就是说,直到我读到noda-time.现在,我认为我们的问题领域需要更多关注与时间相关的功能,而不是我曾经考虑过的.
所以几个问题.