这样的数据包该怎么发?(Sockets) (175分)

  • 主题发起人 主题发起人 ditdot
  • 开始时间 开始时间
D

ditdot

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在用delphi写Client,去和用C写的server相连,server已经存在。
接口约定:包信息由unsigned char字符组成,字段内容不足的以空格填充(如下)。
请求包:
内容 长度
包长度 4
类别 2
内容 10
请问,这样的数据包该怎么发?
另外,实际上包长度现在是16,但不能写0016,而是两个空格加上16,但要求又是unsigned char字符.....本人菜鸟,帮一下吧。
 
没看懂你的定义
一般来说,都是定义成一个record,然后发出去不就行了?
如:
type
TData = record
iLen: Integer;
wType: Word;
Content: array [0..9] of Byte;
end;

send(data, sizeof(data), 0);
 
我太菜了,不过还是希望大家帮一下
》》copy_paste
包长度现在是4,意思是不是最大包长9999,
现在的长度是不是4+2+10=16??
现在对方要求:字段内容不足的以空格填充,那么是不是两个空格加上16??
我是不是理解错误,
如果我理解没有错,那么我应该怎样处理这两个空格,因为对方要求包中是unsigned char字符,而unsigned char字符是不是相当与delphi中的byte?即8位无符号整形,值域在0-255,这样是不会容下空格的,
天哪,我全混了。
 
你如果不清楚,你就应该对C程序员要那包的定义,如果他说了,但你没听清楚,你就向他要这个数据包的定义,如果这都不清楚,其它事都没法做。即使我答了你其它的问题。
 
>>copy_paste
既然如此,死心了,
但在揭贴之前,还是希望copy_paste能帮着说一下:
就您对sochets包协议的理解,我以上的说法是否正确?
即:
1、包长度现在是4,意思是不是最大包长9999,
2、现在的长度是不是4+2+10=16??
3、字段内容不足的以空格填充,那么是不是两个空格加上16??
谢谢
 
晕,你们之间约定开发,另一方不可能说没有提供之间的定义吧。
按你所说的话,C里面的定义应该是我上面所写的TData的那种结构,我之所以那样做,是让你确认一下。

包长底是4的话,即是4字节,一般来做是Integer, Cardinal,它的取值范围是int(-2G~~2G), Cardinal(0..4G),不是9999,因为你的请求包总共长度是16,虽然不需要用到那么多,但一般来说是为了扩展使用的,所以一般长度的定义一般是:Integer, Cardinal.

现在的长度就是:16
Integer 4
Word 2
Content 10
相加就是16,record类型,如果不加packed,是以默认方式4字节对齐,即说,如果Content的长度为11的,它的SizeOf返回的就是20,而不是17(不加packed的情况下)

3、字段内容不足的以空格填充,那么是不是两个空格加上16??
可能是说:
所说的字段内容应该是说Content域,即是说,如果Content内容没有10的话,以空格标识
那么操作之前,你可以这样做:
Data.Len := int value;
Data.iType := type value;
{ 初始Content, 将Content用空格填充 }
FillChar(Data.Content, SizeOf(Data.Content), 32);
Data.Content ...赋值

...// other code

下次提问,还是描述清楚自己所遇的问题,不然大家猜来猜去的
 
谢谢copy_paste
 
后退
顶部