下面是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〕包头控制信息:
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开始依次为数据内容, // 实际使用时取其地址作为指针使用
};
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;
} 可以照着上面写
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;// 传送内容
};
这一句是什么意思?为什么我加这一句就不对呢?
你这样的字段是变长的?只是靠null结束吗?要是这样,确实是麻烦点。
要写成这样的,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的。
实际的值如10005,目前都是5位,但也可能会变的,我也不是很理解这句话.我最搞不明白的是下面这句:
char datatrans[1];// 传送内容,从datatrans开始依次为数据内容, // 实际使用时取其地址作为指针使用
实际的值可能是这样:13988888888~121~222~4785~0~1~备注
也是变长的.
中国联通SGIP协议1.2版本C#实现这个应该对你有帮助
这样写仍然不对,要晕了
这个帖子你改过了,昨天还没下标呢。有下标就是定长的,原先我还怀疑C/C++里面能不能用你那种结构呢