TCP/IP通讯,发送大数据包会不会有问题?(100分)

  • 主题发起人 主题发起人 onedolph
  • 开始时间 开始时间
确实在底层tcp/ip是把数据包分段发送的,但对于tcp/ip开发来说,发送接收的是一个整体
如果我没有理解错,onedolph说的数据包是tcp/ip上层的数据包,不是底层的ip包,
与什么分段之类的毫无关系

好像大家都认为tcp/ip传输数据是可靠的,但记住前提是开发的时候必须符合tcp/ip的处理
方式才是可靠的,例如接收,有谁调用Recv等接受函数一次收到过10M以上的数据?
因为tcp/ip缓冲区的大小不到10M,所以不可能一次收到那么多的数据,必须多次调用recv
分段接收然后自己组合。再例如发送,哪位一次成功调用send函数发送过10M以上的数据?
原理同样,缓冲区不够,发送10M的数据立马返回错误。老老实实分段发送是上策。
 
我当然不会从底层做,我就是用TServerSocket 和 TClientSocket 做的。
发送失败再发送,直到成功。我主要是关心,会不会出现接收方会不会出现少或错字的情况。
 
1:不会出现接收方会不会出现少或错字的情况

2:发送数据的单位最好在默认的缓冲区的大小,速度快(可以一次性发送/接收完成)。

3:理论上可以发送在你的内存大小的数据包,但会占满CPU。我试过一次
发过30M的文件,CPU100%,mouse动都不动,持续了几秒钟后恢复正常。

4:如果你不放心TCP,你可以做应答,即发送后等待另一方接收完成,并发送
回接收的字节数,判断是否正确。你到CSDN.delphi.网络的精华区那里找找,
那里有个应答例子。

5:接收时,需要分段接收,如:接收缓冲区有:8K(default),发过来的数据有:10K,
那recv时,你即使说要recv 10K,它也只是返回小于缓冲区的数量,必须持续接收。

6:不建议设置太大的缓冲区,如果真是需要大的缓冲,请设置缓冲区的数量为:0,这样
会直接使用AppExe的缓冲(具体参考“Windows网络编程“)
 
谢谢copy_paste,你发30M的时候是用主线程发的还是另起一个线程来发的?
接收方数据完整否?检查过吗?
 
多人接受答案了。
 

Similar threads

后退
顶部