TCP通信问题

wy_li 2012-07-24 09:20:28
最近遇到个网络通信的问题,协议如下

采用TCP长连接,每个消息包含:1、二进制包头;2、包内容(xml格式)。
HeardFlag(int) Length(int) Sequence Ver Enc Rec
4 4 4 1 1 2


我想用indy的idTCPClient 和idTCPServer 来接收和发送数据,我的想法是包头用个结构体,内容是把xml转化成文件流,现在不知道怎么把包头和内容一起发送出去,求高手解惑,第一次做这个TCP通信的东西。
...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hexpate 2012-07-25
  • 打赏
  • 举报
回复
第一种: 简单点, 直接创建一个MemoryStream, 然后把头和包内容都写进去, 然后直接发这个MemoryStream的Memory指针里的内容.
第二种: 发2次发过去, 第一次发头, 第二次发包内容

不管对于第一种还是第二种, 你都需要有自己的包处理过程, 也就是所谓的应用层通信协议 用来处理粘包的问题, 比如对方收到完整的消息包后才处理数据.
kaikai_kk 2012-07-25
  • 打赏
  • 举报
回复
结构体可以定义文件流或者内存流;
结构体可以添加其它成员存放其它的信息,传输数据就把这个结构体发送出去即可

type
TRec=record
Header:array of Byte;
XML:TFileStream; //或TMemoryStream
end;

wy_li 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
to :kaikai_kk 感谢你的回复,简单明了。
to :Hexpate 假如我是第一种发送方式,我是先把包内容放到一个MemoryStream里,然后在用一个指针变量指向这个stream,在把这个指针当参数发送过去吗,
还有,我接收到这个包的时候,怎么把这个指针里的内容分拆成包头和包内容呢,能不能简单的写个例子,我不知道如何按上面的协议读出内容。


例子……
[/Quote]
你看我这样定义包的内容,怎样把这个结构体传过去呢,另外接收是其他公司的程序来做的,他们可能会按协议规定的去截包里的内容,这样传输另一方能正确读出来吗
PRec=^TRec;
TRec= record //用结构体存包信息
HardFlag:shortstring;
Length:integer;
Sequence:integer;
Ver:byte;
Enc:byte;
Rec:WideChar;
XML:TFileStream;
end;












fang 2012-07-25
  • 打赏
  • 举报
回复
typedef struct
{
unsigned char start;
unsigned char flag;
unsigned char cmd;
unsigned char len;
unsigned char data[BUFSIZE];
} tagPacketItem;
len=0没数据,如果你的数据比较大在接收端还是判断下接收的返回值
Hexpate 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
to :kaikai_kk 感谢你的回复,简单明了。
to :Hexpate 假如我是第一种发送方式,我是先把包内容放到一个MemoryStream里,然后在用一个指针变量指向这个stream,在把这个指针当参数发送过去吗,
还有,我接收到这个包的时候,怎么把这个指针里的内容分拆成包头和包内容呢,能不能简单的写个例子,我不知道如何按上面的协议读出内容。
[/Quote]

例子你到codeproject上找delphi相关的通讯程序
Hexpate 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
结构体可以定义文件流或者内存流;
结构体可以添加其它成员存放其它的信息,传输数据就把这个结构体发送出去即可

type
TRec=record
Header:array of Byte;
XML:TFileStream; //或TMemoryStream
end;
[/Quote]

你写错了吧, 你要知道 array of byte是动态数组, 存储的是指针, 这样直接把结构体发出去, 对方收到的是指针, 而不是内容. 你不写清楚, 我担心别人看到照抄就完了.
wy_li 2012-07-25
  • 打赏
  • 举报
回复
to :kaikai_kk 感谢你的回复,简单明了。
to :Hexpate 假如我是第一种发送方式,我是先把包内容放到一个MemoryStream里,然后在用一个指针变量指向这个stream,在把这个指针当参数发送过去吗,
还有,我接收到这个包的时候,怎么把这个指针里的内容分拆成包头和包内容呢,能不能简单的写个例子,我不知道如何按上面的协议读出内容。

1,593

社区成员

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

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