下面是C++定义的一个通讯协议,现在我要定一段程序利用这个协议与服务器能讯.因为我不懂C,只好用C#写,那么在C#中怎么定义这两个结构体?然后怎么样赋值?再通过SOCKET发出去?
这个问题零零碎碎问了几次了,反正也没真正解决,时间不等人,等不及了,有谁会的,写个代码给我吧,拜托了.1〕包头控制信息:
struct PktCtlMsg
{
 unsigned long len;//  包的总长度,为包控制信息和实际传送内容长度之和
 unsigned char factorycode; //厂商编码, 新科公司=186,华为公司=168
 unsigned char progid;      //  进程号
 unsigned char morepkt;  //  是否还有后续包,1有,0无
 char cmd_id[10];     //  命令字,最大长度为9,以null结束
          long start_num;     //  起始记录号(从0开始)
 long end_num;      //  终止记录号(为0时表示其余全部数据)
 long request_id;        // 请求ID
 long answer_id;          // 应答ID(保留)
 long sequence;          // 包序号
 char rec_seperator[5]; // 记录分隔符,最大长度为4,以null结束
 char field_seperator[5];// 字段分隔符,最大长度为4,以null结束 
 long reserved1;          // 保留
 long reserved2;          // 保留
}; 2) 协议包结构
struct PktMsg
{
    struct PktCtlMsg  CtlMsg;   // 包控制信息
    short errorcode;       // 返回码
    char datatrans[1];// 传送内容,从datatrans开始依次为数据内容,                  // 实际使用时取其地址作为指针使用
};

解决方案 »

  1.   

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct TimeZoneInformation

      public int bias;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
      public string standardName;
      SystemTime standardDate;
      public int standardBias;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
      public string daylightName;
      SystemTime daylightDate;
      public int daylightBias;
    } 可以照着上面写
      

  2.   

    〕包头控制信息:
    struct PktCtlMsg
    {
     unsigned long len;//  包的总长度,为包控制信息和实际传送内容长度之和
     unsigned char factorycode; //厂商编码, 新科公司=186,华为公司=168
     unsigned char progid;      //  进程号
     unsigned char morepkt;  //  是否还有后续包,1有,0无
     char []cmd_id;     //  命令字,最大长度为9,以null结束
              long start_num;     //  起始记录号(从0开始)
     long end_num;      //  终止记录号(为0时表示其余全部数据)
     long request_id;        // 请求ID
     long answer_id;          // 应答ID(保留)
     long sequence;          // 包序号
     char []rec_seperator; // 记录分隔符,最大长度为4,以null结束
     char []field_seperator;// 字段分隔符,最大长度为4,以null结束 
     long reserved1;          // 保留
     long reserved2;          // 保留
    }; 2) 协议包结构
    struct PktMsg
    {
        struct PktCtlMsg  CtlMsg;   // 包控制信息
        short errorcode;       // 返回码
        char []datatrans;// 传送内容                  
    };
      

  3.   

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    这一句是什么意思?为什么我加这一句就不对呢?
      

  4.   

    char []rec_seperator; 这种写法在用的时候不正确
      

  5.   

    我记得前两天才有一个和这个一模一样的问题,不是已经有fixed buffer解法了吗?
      

  6.   

    char []cmd_id;     //  命令字,最大长度为9,以null结束
    你这样的字段是变长的?只是靠null结束吗?要是这样,确实是麻烦点。
      

  7.   

    1、[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    要写成这样的,StructLayout在命名空间:System.Runtime.InteropServices中
    2、long 转成int, unsigned long 转成int,c#中的long是Int64。
    3、char转成byte
    4、char[n]转成fixed byte[n]
    5、每个字段都要是public的才能被外部访问,默认是private的。
      

  8.   

    char []cmd_id[10];     //  命令字,最大长度为9,以null结束
    实际的值如10005,目前都是5位,但也可能会变的,我也不是很理解这句话.我最搞不明白的是下面这句:
    char datatrans[1];// 传送内容,从datatrans开始依次为数据内容,                  // 实际使用时取其地址作为指针使用
    实际的值可能是这样:13988888888~121~222~4785~0~1~备注
    也是变长的.
      

  9.   

    char[n]转成fixed byte[n]时,我是这样写的:public fixed byte[] cmd_id; 编译通不过
      

  10.   

    http://jeasonzhao.cnblogs.com/archive/2006/05/02/390543.html
     中国联通SGIP协议1.2版本C#实现这个应该对你有帮助
      

  11.   

    char[n]转成fixed byte[n]时,我是这样写的:public fixed byte[] cmd_id; 编译通不过哦,应该是这样的public fixed byte cmd_id[]
      

  12.   

    public fixed byte cmd_id[] 也通不过
      

  13.   

    fixed 就有"Type expected"错误
      

  14.   

    public fixed byte cmd_id[10]
      

  15.   

    public fixed byte cmd_id[10]
    这样写仍然不对,要晕了
      

  16.   

    你在你上一个帖子里不是已经说能用了吗?除非你现在用的vs2003,那就得用另外的方法了。
    这个帖子你改过了,昨天还没下标呢。有下标就是定长的,原先我还怀疑C/C++里面能不能用你那种结构呢
      

  17.   

    用的是vs2003,是有下标的,现在我改用C++.NET写,结构体定义自然没有问题了,但又不知该怎么发送这个结构体了,麻烦呀.
      

  18.   

    上面在C++.NET里用的是Socket* socket发送的,不知是不是还有更好的.