DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 495744673
今日帖子: 23
在线用户: 18
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jfhyn (贺兰之边) ▲▲▲▲▲ -
注册会员
2019/5/9 21:57:01
标题:
请教大家,Delphi-Cross-Socket的UserData,UserObject的用法 浏览:221
加入我的收藏
楼主: Delphi-Cross-Socket的TestCrossSocket中,我发送数据增加UserData数据,但是在服务端却接收不到.
//客户端
procedure TfmMain.Button2Click(Sender: TObject);
const
  DATA_SIZE = 10 * 1024 * 1024;
var
  LStream: TBytesStream;
  LConns: TArray<ICrossConnection>;
  I: Integer;
  B: Byte;
begin
  LConns := FSocket.LockConnections.Values.ToArray;
  if (LConns <> nil) then
  begin
    LStream := TBytesStream.Create(nil);
    for I := 1 to DATA_SIZE do
    begin
      B := RandomRange(0, 255 + 1);
      LStream.Write(B, SizeOf(Byte));
    end;
    LStream.Position := 0;
  //增加的UserData数据----------
    LConns[0].UserData := PChar('abcdefg');
    LConns[0].SendStream(LStream,
      procedure(AConnection: ICrossConnection; ASuccess: Boolean)
      begin
        TThread.Queue(nil,
          procedure
          begin
          if ASuccess then
          ShowMessage( 'SendStream SUCCESS!!' + FSendCount.ToString)
          else
          ShowMessage('SendStream FAILED!!');
          end);
        FreeAndNil(LStream);
      end);
  end;
  FSocket.UnlockConnections;
end;
服务端
procedure TfmMain.OnReceived(Sender: TObject; AConnection: ICrossConnection;
  ABuf: Pointer; ALen: Integer);
begin
  //此处接收不到数据,一直是nil----------
 if AConnection.UserData <> nil then
   log(PChar(AConnection.UserData));
  AtomicIncrement(FRcvdCount);
  AtomicIncrement(FRcvdBytes, ALen);
end;

不知道为什么,恳请大神指导一下.
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ▲▲▲▲△ -
注册会员
2019/5/9 23:25:51
1楼: 应该你没有分配内存,过程结束后系统回收了字符串的内存造成的,我这是没有问题的.
唯一不同的是我这是结构体而且是手动分配内存的.
----------------------------------------------
按此在新窗口浏览图片
作者:
男 abcjingtong (jingtong) ▲▲▲▲▲ -
注册会员
2019/5/10 15:15:51
2楼: 可以把UserData写到LStream里一起发送了,这样做需要客户端处理下粘包
----------------------------------------------
18114532@qq.com
作者:
男 abcjingtong (jingtong) ▲▲▲▲▲ -
注册会员
2019/5/10 17:09:41
3楼: 个人觉得CrossSocket对有经验的开发人员更合适,而DIOCP适合注重应用层面的人士,我个人把DIOCP中的MsgPack类用到CrossSocket中然后写了粘包处理,算是二者的结合吧。如果有需要我可以发给你。
----------------------------------------------
18114532@qq.com
作者:
男 jfhyn (贺兰之边) ▲▲▲▲▲ -
注册会员
2019/5/10 23:17:51
4楼: 现在明白了UserData等的用法,是为了附加信息,处理发送或者返回数据的完整性.
谢谢大家!
@abcjingtong 3楼兄弟,能否把Demo发给我学习一下,谢谢!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行39.0625毫秒 RSS