Socket 每次能读多少数据?(200分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
TClientSocket NonBlock
OnRead里读数据,每次好像有上限?
我在服务器端定义了一个结构,传回来,数据量比较大
OnRead
begin
ProcessData(Socket.ReceiveText);
end;
当传的数据量小,一切正常,大的话,最多好像传8xxxbit,怎么办?
 
最好一次不要传多了
 
tcp是字节流机制,似乎TClientSocket不能置push和urgent位。。。
 
TCP是“管道”,如果网络通畅的话,理论上它可以传送无限长的数据。我在应用中曾经一次
接收过1024个以上的字符。要视你的网络质量情况,局域网快一些。互联网就会一次接收到
少一些的数据。
但实际在底层也有缓冲区长度限制,因为TCP/IP本来就是在“不可靠的链路上实现的可靠连接”。
它也有分组发送、纠错等机制。
你可以不用去管它,关键在于你接收的缓冲区大小,你收掉一点,后面的数据又不会丢失,再
接着收好了,不用担心。
 
难道
TServerSocket执行一次SendText('abc...');//可能很长
TClientSocket可能会触发多个OnRead事件吗?
如果是这样,我如何取得自定义的结构呢?(可能很常,甚至包括图形和声音)
 
tcp会分包,所以没有问题的
 
但问题就是出了问题啊
 
还是没有解决
 
是有问题,我记得去年我做的一个东西中,我在linux下做东西(http),从网络上读数据(read),如果是小东西
没什么现象,但如大了,在接收了一段东西(约为1kbyte左右)后明显有一个等待,是否可理解为ip在此分包?
另看到系统的一些代码,都定义读写缓冲区一般设为4096byte,最大也是8192byte.也就是说最大如果过了此值的
如果网络速度过快的话就会丢包。这是不是也代表写数据时最多不会此值?
以上东西为个人胡猜,不做凭证。最近有事,过段时间再去深入看一下
 
我认为还是用block方式比较好。
这些问题在block里比较好解决。
 
我也觉得socket对一次的传输长度是有限制的。上年我用vc的异步Socket类做一个网络通
信的程序,大概一次传输超过5k字节左右就会有问题,会触发两次事件。
 
TServerSocket执行一次SendText('abc...');//可能很长
TClientSocket可能会触发多个OnRead事件吗?
都说了嘛 不能要求你send一个10k字节,那边就只触发一个OnRead,
因为tcp只保证有序,正确的到达另一个连接端。如果一定要保证数
据结构,必须自己做相应的处理,比如你的结构是定长的,你可以设
一个全局的二级的缓冲tmpbuf,在onread里,每次从缓冲读出的数据先放到
这个二级缓冲tmpbuf里去
然后循环从tmpbuf里按固定字节数读出你的结构数据 并把这几个字节从tmpbuf
里删除,一直到tmpbuf的长度小于你的数据结构长度(看来得等下一次的onread了)
当然这里必须保证这个onread不会重入。
如果是不定长的结构 你就必须定义一个边界标记 然后每次查找这个标记 剩下的
和上面相同。注意这个标记不要和数据冲突 可模仿0比特插入法 字符插入法等
 
TCP会分包的,
 
可是TClientSocket的缓冲区大小有限制,你不能希望一个几兆的东东,只触发一次OnRead
事件就全收回来了。
我同意G622的做法。
 
我没有用国TClientSocket,只用过winsock,那样完全没有问题,至于TCP分包,一般的OS设
置成8096byte,但是这和应用层几乎没有关系,这些对于我们是透明的
 
1.发一个大东西,tcp或ip分自动分割成小的包这不错。但丢不丢却与接受数据端的缓冲区大小
有着很大的关系。特别是你在本地网或本地实验时,传输速度相当快,如你没有及时从缓冲区
读取数据的话,后面来的数据就会把前面的数据冲了.
2.发一次数据可能触发两次或多次onread这是正常的,正是分包带来的。极端的情况是你在
两次onread之间没有读取前次数据,以至丢失数据.
 
接上面
所以要你先把数据放到一个自己的缓冲区(或先进先出的队列)里,保证接收数据的正常。
处理放到另外的线程里进行
 
cj:按g622的方法试试?
 
接上面
成功了 就多多的给分 ?
:)
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部