socket通讯的问题(100分)

  • 主题发起人 主题发起人 wx_zhang365
  • 开始时间 开始时间
W

wx_zhang365

Unregistered / Unconfirmed
GUEST, unregistred user!
各位编Socket程序时有没有碰到这种情况,就是如果一端连续发送的数据很多,在另一端
很容易出现两个包接在一起,或者包里面的数据丢失一部分的情况?怎么解决?
 
你的发送信息有没有用#13+#10结尾?
 
不会吧,我用socket队列作代理服务器程序是也很正常,除非你的消息包格式定义不严格
 
或者在调用ReceiveBuf时缓冲区溢出
 
在客户端程序中使用TSoocketClient,在服务器程序中使用TSocketServer,然后均使用
非阻塞通讯方式当服务器端接收到一个字符之后就进行相应的操作。
 
数据很频繁的时候,遇到过这样问题
好像只有在数据包中加前缀了
 
有什么好的方法吗?比如设定缓冲区大小之类的
 
定义高层协议。
 
同意楼上的观点。
要能够区分不同的数据包,就必须定义一个能够进行分离的高层协议。最简单的方法就是在每个包的头部
加上4个字节的长度信息。我定义的一个协议可以每秒钟收发数百个IP包而不出差错。
 
to lczhuohuo,有例子吗?
楼上的,给我发一个例子好吗? wx_zhang365@sina.com

在另一端如果用多线程同时向这边发上千条,很容易出现丢包或者包里数据出现乱码的情况。
象这种情况用在数据包头加长度的方法估计也会出问题,可能会出现乱码。




 
to creation-zy and lczhuohuo
能说的更清楚一些吗?或发一个例子给我好吗?buptyx@263.net


要能够区分不同的数据包,就必须定义一个能够进行分离的高层协议。
最简单的方法就是在每个包的头部加上4个字节的长度信息
 
to creation-zy and lczhuohuo
能发一个例子给我好吗? tommess@21cn.com
 
简单的谈一下思路吧:
数据包结构:(以Byte为单位)
0:信息标志位,必须为非零值
1-4:信息正文长度,DWORD类型
5-:信息正文
接收方应该使用两个缓冲区(必须足够大——我用的是16K),同一时刻只能有一个缓冲区处于
写状态,而另一个缓冲区则必须处于读状态。一旦读缓冲区的信息被处理完毕,就交换两个缓冲区
的角色,实现流水工作。在实际操作是要注意绝对不能同时读写同一个缓冲区。
每个缓冲区有两个指针——读指针与写指针,写指针总是指向接收缓冲区有效信息的末端,在
读取时,要注意使读指针不能超过写指针。
每次Socket接收到一个Socket包,并不要急于处理它们,而是将其写入到接收缓冲区的末端。
信息读取线程针对读缓冲区进行信息读取。根据上面的信息包结构,很容易得到信息的读取方法:
1.判断读指针指与写指针是否重合,如重合,则说明信息已经读取完毕,读取过程结束,进行进行
缓冲区交换,再次进行读取操作。
2.判断读指针指向的Byte是否为0,若为零,则说明读指针之后不再有信息(要做到这一点,接收
缓冲区在进行写操作之前必须初始化为全零),读取过程结束,其余操作同上。
3.将读指针加1,读取信息包中的正文长度信息。并根据正文长度将正文信息读取到相应的临时缓冲
区中去,调用相应的信息处理过程对其进行处理。在处理完毕之后,将读指针置于正文信息之后,
转到过程1。
思路就讲这些了,如有不明白的地方,可以来信问我。 E-mail: creation_zy@china.com
 
to creation-zy
你的思路很不错
发一个例子给我好吗?
tommess@21cn.com
 
我也想要呀
writer@cm163.net

最好贴出源码,不用发妹儿那样麻烦。
 
对不起,我的代码过于复杂,功能远比上面介绍的要多。上回砍了老半天才整理出核心算法,
Mail给了wx_zhang365(如果我没有记错的话),我实在不想再砍了。你们发信给wx_zhang365
要代码吧。非常抱歉。
其实有了思路代码就很好写了。我记得核心算法的代码量很小,不到200行。大家自己搞定吧。
 
wx_zhang365兄:
你能把creation-zy给你的源代码给我一份吗,谢谢
gung_@163.com
 
高手们,请帮我解决这个问题好吗?很急的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1037706
 
后退
顶部