求助:在使用TClientSocket获取TServerSocket发送的数据的时候,如果两次发送的时间过短,两条数据会被作为一条数据读取,如果Sleep(20)可

csym 2003-04-05 03:34:31
如题,谢谢!
...全文
71 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
csym 2003-04-12
  • 打赏
  • 举报
回复
谢谢各位的答复,我已经按照字节流的方法作好了,每次传递固定大小的结构:
typedef struct
{
int Type;
char Data[200]; //根据type的不同按不同的结构写入数据
}PACKET;
在程序中设置一个接收缓冲区接收传递的数据,从缓冲区中读出数据;

因为我的程序是网络的棋牌游戏,所以固定大小的传递也不会产生很大的影响。
sxy790827 2003-04-11
  • 打赏
  • 举报
回复
确实是个难题
netying 2003-04-11
  • 打赏
  • 举报
回复
如果是这样的格式,怎样知道哪里是开头?就是说如果发送数据的速度很快的话,接收的时候是不是每个包应该有一个唯一可以辨别的包标志?这个标志不太好选择呀
BCB 2003-04-11
  • 打赏
  • 举报
回复
最简单的格式:
前两个字节放长度,后面放实际内容,
这样,每次读数据,先读两字节,取得长度,再以这个长度
第二次去读包的字节内容,
边界不是很清楚了,格式最好稍复杂一点,象QQ都有一个
Socket会话命令集,就象网络的会话层协议



netying 2003-04-11
  • 打赏
  • 举报
回复
怎么样才比较好呀
pp616 2003-04-10
  • 打赏
  • 举报
回复
通讯啊。为一个单向发送呢。
你可以发一个然后等一个回应。收到回应在发送下一个数据包啊。
netying 2003-04-09
  • 打赏
  • 举报
回复
up...
netying 2003-04-09
  • 打赏
  • 举报
回复
BCB老大请问您:您的包格式中,您觉得用什么做包标记比较好?
还有数据流用什么类型比较好?
cdsnti 2003-04-05
  • 打赏
  • 举报
回复
Sleep(20)可不算是解决问题的方法,你可能是用的 sendtext(),试一下用二进制数据流方法,自己定义通信传输的数据包结构就可以解决问题,你试一下,不行的话把代码贴上来我帮你修改。
BCB 2003-04-05
  • 打赏
  • 举报
回复
TCP协议是数据流是无边界的,两次发送的数据之间并没有界限,会
一次收到合并的包,解决这个问题很简单:自已定义数据流的格式,
在格式中放上每个包的长度.靠你自已发挥了,用Sleep无济于事.
如我常用的包格式定义:
包标记[2B],命令标志[2B],数据字节[2B],数据流.

UDP是有边界的协议,不同时间发送的包,决不会混在一起.
如此而已.

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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