首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • sendbuffer问题 [已结帖,结帖人:czyoooo]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 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,奇怪了!
    怎么会发送的内容会有变化呀?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 11:58:471楼 得分:0
    我知道了,要ClientSocket.socket.sendbuf(a[0],sizeof(a));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hongqi162
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 14

    发表于:2008-11-14 12:00:112楼 得分:0
    快啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 12:17:513楼 得分:0
    ClientSocket.socket.sendbuf(a[0],Length(a));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 12:47:474楼 得分:0
    发送的时候怎么有些时候多,有些时候少,没有一次正确的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 12:57:575楼 得分:0
    ClientSocket.socket.sendbuf(a[0],Length(a));
    发送第一个包多了 00 00;

    发送第二个包少了一断 90 6D AD 00 27 1F CA 6B;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 13:03:176楼 得分:100
    辅助方法:
    Delphi(Pascal) code
    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; function RecvBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Integer; var P: PChar; iNeedRecv,iRecved: Integer; begin Assert(Buffer<>Nil); Assert(Socket<>Nil); Result := 0; if Not Socket.Connected then Exit; P := Buffer; iNeedRecv := BufferLen; while iNeedRecv>0 do begin iRecved := Socket.ReceiveBuf(p^,iNeedRecv); if iRecved <= 0 then Exit; Inc(Result); Inc(p,iRecved); Dec(iNeedRecv,iRecved); end; end;


    var a:array of  byte;
    iLen: Integer;

    iLen := 180;
    SetLength(a,iLen);

    a[0]:=$01;
    a[1]:=$1E;
    ......


    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;

    接收端,也先接收一个integer(四个字节)作为实际长度,然后再根据该长度值继续接收数据,收完以后接着又是接收长度...数据...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 13:12:137楼 得分:0
    服务器端不是不是我写的,其实和外挂差不多!
    我每次发送都sleep(2000);
    但是比较奇怪的是第一包多,第二包少,暂时测试的情况是这样的,楼上兄弟不知道,是否可以解释?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fangsp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 13:14:428楼 得分:0
    你把它转化为字符串发送呢?
    Socket.SendText
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 13:14:499楼 得分:0
    那你用我上面 的那个SendBuffer发送就是了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 13:16:2210楼 得分:0
    引用 8 楼 fangsp 的回复:
    你把它转化为字符串发送呢?
    Socket.SendText

    除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 13:37:5511楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 13:55:2812楼 得分:0
    除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.

    如何把array of  byte 转化为stream发送呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fangsp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 13:58:0813楼 得分:0
    我以前都是用
    SendText发送的 也没遇到过这样的问题啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 14:02:2014楼 得分:0
    引用 13 楼 fangsp 的回复:
    我以前都是用
    SendText发送的 也没遇到过这样的问题啊

    SendText内部就是调用的SendBuf,你觉得你会特殊一点么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 14:03:5115楼 得分:0
    引用 12 楼 czyoooo 的回复:
    除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.

    如何把array of  byte 转化为stream发送呢?

    sendStream用的就是类似我上面写的那个SendBuffer的机制。如果你觉得不麻烦,也可以创建一个TMemoryStream,然后再WriteBuf,然后再SendStream.
    Delphi(Pascal) code
    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;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 14:04:4116楼 得分:0
    已经测试了
    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;
    红色部分怎么回事情,没有理解!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 14:06:5517楼 得分:0
    已经测试了
    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;
    红色部分怎么回事情,没有理解!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 14:12:5218楼 得分:0
    Length(a)是你的数组的元素个数。你现在使用的是Byte怕你以后改用WideChar,或者Smallint,或者Integer,或者其它甚至record等等之类的,所以增加了这样一种机制,能够检测出实际的字节数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 17:09:2319楼 得分:0
    用你的方法测试,发送第一包的时候多了00 00,
    发送第二个包少了一段90 6D AD 00 27 1F CA 6B。。。。

    两个包发送都不一样,COMMVIEW里面的内容是这样的!
    搞不清楚什么原因了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 17:17:5320楼 得分:0
    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 17:38:5121楼 得分:0
    顶一下,希望今天解决这个问题!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unsigned
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      2

      6

    发表于:2008-11-14 18:47:1022楼 得分:0
    可能需要用Sleep,并适当调整Sleep的时间。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 20:02:5623楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 20:04:2324楼 得分:0
    我每次都SLEEP(2000)还是这样的呀,郁闷中。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czyoooo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-14 20:15:5925楼 得分:0
    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
    修改 删除 举报 引用 回复