sendbuffer问题

czyoooo 2008-11-14 11:52:10
需要发送的内容是:
0X00 01 1E 0F 00 3C 00 00 ......
0X01 ..................

.....................



发送部分!
var a:array of byte;
SetLength(a,180);

a[0]:=$01;
a[1]:=$1E;
......
ClientSocket.socket.sendbuf(a,sizeof(a));
发现发送的数据变掉了,SNIFFER看到的是04 26 D0 00 FC F6 ...而且长度也变了,最后面有FF FF,奇怪了!
怎么会发送的内容会有变化呀?
...全文
1004 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
ClientSocket.socket.sendbuf(a[0],Length(a));
发送第一个包多了 00 00;

发送第二个包少了一断 90 6D AD 00 27 1F CA 6B;
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
发送的时候怎么有些时候多,有些时候少,没有一次正确的!
僵哥 2008-11-14
  • 打赏
  • 举报
回复
ClientSocket.socket.sendbuf(a[0],Length(a));
hongqi162 2008-11-14
  • 打赏
  • 举报
回复
快啊
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
我知道了,要ClientSocket.socket.sendbuf(a[0],sizeof(a));
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
f Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit;
sleep(2000);

if Not SendBuffer(PChar(@b[0]),sizeof(b[0])*Length(b),ClientSocket1.socket) then Exit;
sleep(2000);


第二个用*length(b),第一个没有怎么解释呀?

另外我发送固定长度也有问题呀!

ClientSocket1.socket.SendBuf(a[0],148) ;
sleep(5000);

ClientSocket1.socket.SendBuf(b[0],54) ;
sleep(5000);

和使用你的方法一样也是少14个
僵哥 2008-11-14
  • 打赏
  • 举报
回复
晕倒...

[Quote=引用 17 楼 czyoooo 的回复:]已经测试了
if Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit;
sleep(2000);

if Not SendBuffer(PChar(@b[0]),sizeof(b[0]),ClientSocket1.socket) then Exit;
sleep(2000);

两个包一个也没有发送!

if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit;
//ClientSocket.socket.sendbuf(a,sizeof(a));
if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit;
红色部分怎么回事情,没有理解! [/Quote]
我告诉你的是:
sizeof(b[0])*Length(b)
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
SELEP(5000)也一样刚刚测试了一下,我研究一下:
0x0000 01 C9 00 45 00 01 1C 00-3A 33 ED 7E 00 00 00 00
0x0010 90 6D AD 00 5E 8A C8 6B-96 06 06 00 44 36 CA 6B
0x0020 96 06 06 00 01 00 00 00-


90 6D AD 00 27 1F CA 6B F1 43 40 00 01 00
和上面的0x0010部分重复,是否是原因呀,另外一个包用你的方法测试会多一个00 00
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
我每次都SLEEP(2000)还是这样的呀,郁闷中。。。。
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
僵哥 2008-11-14
  • 打赏
  • 举报
回复
可能需要用Sleep,并适当调整Sleep的时间。
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
顶一下,希望今天解决这个问题!
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
0x0000 01 C9 00 45 00 01 1C 00-3A 33 ED 7E 00 00 00 00
0x0010 90 6D AD 00 5E 8A C8 6B-96 06 06 00 44 36 CA 6B
0x0020 96 06 06 00 01 00 00 00-90 6D AD 00 27 1F CA 6B
0x0030 F1 43 40 00 01 00

第二个包发送缺红色的内容!


czyoooo 2008-11-14
  • 打赏
  • 举报
回复
用你的方法测试,发送第一包的时候多了00 00,
发送第二个包少了一段90 6D AD 00 27 1F CA 6B。。。。

两个包发送都不一样,COMMVIEW里面的内容是这样的!
搞不清楚什么原因了!
僵哥 2008-11-14
  • 打赏
  • 举报
回复
Length(a)是你的数组的元素个数。你现在使用的是Byte怕你以后改用WideChar,或者Smallint,或者Integer,或者其它甚至record等等之类的,所以增加了这样一种机制,能够检测出实际的字节数。
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
已经测试了
if Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit;
sleep(2000);

if Not SendBuffer(PChar(@b[0]),sizeof(b[0]),ClientSocket1.socket) then Exit;
sleep(2000);

两个包一个也没有发送!

if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit;
//ClientSocket.socket.sendbuf(a,sizeof(a));
if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit;
红色部分怎么回事情,没有理解!
czyoooo 2008-11-14
  • 打赏
  • 举报
回复
已经测试了
if Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit;
sleep(2000);
两个包一个也没有发送!

if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit;
//ClientSocket.socket.sendbuf(a,sizeof(a));
if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit;
红色部分怎么回事情,没有理解!
僵哥 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 czyoooo 的回复:]
除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.

如何把array of byte 转化为stream发送呢?
[/Quote]
sendStream用的就是类似我上面写的那个SendBuffer的机制。如果你觉得不麻烦,也可以创建一个TMemoryStream,然后再WriteBuf,然后再SendStream.
function SendBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Boolean;
var
P: PChar;
iLen,iSent: Integer;
begin
Assert(Buffer<>Nil);
Assert(Socket<>Nil);
Result := false;
if Not Socket.Connected then Exit;
P := Buffer;
iLen := BufferLen;
while iLen>0 do
begin
iSent := Socket.SendBuf(p^,iLen);
if iSent <= 0 then Exit;
Inc(p,iSent);
Dec(iLen,iSent);
end;
Result := true;
end;
僵哥 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fangsp 的回复:]
我以前都是用
SendText发送的 也没遇到过这样的问题啊
[/Quote]
SendText内部就是调用的SendBuf,你觉得你会特殊一点么?
fangsp 2008-11-14
  • 打赏
  • 举报
回复
我以前都是用
SendText发送的 也没遇到过这样的问题啊
加载更多回复(7)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧