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

  • 主题发起人 主题发起人 onedolph
  • 开始时间 开始时间
O

onedolph

Unregistered / Unconfirmed
GUEST, unregistred user!
TCP/IP通讯,发送大数据包会不会有问题?
比如,我每个数据包都会大于1M,最大50M,平均10M。
这样会不会出错,比如收到不完整,少了一两个字节,或错了一两个字节?
请大伙发表意见或建议。
 
用TCP/IP不会,不过你最好还是分断再传
 
来自:zw84611, 时间:2002-11-25 17:08:00, ID:1458491 | 编辑
-----------------------------------------------------------
在以太网中,链路帧纯最大不得超过1500字节,如果超出,系统会自动分段。如果你一次
发送的数据超过1.5k,那么绝对不会是通过一个IP包发过去的,至少要两个IP包,这和你
每次读不超过1.5k数据,分几次发送没有区别。
 
理论上 是不限制包的大小。不过还是分开发的好,可以控制流量,就是出错了 也可以检测到。
 
赞同zw84611
 
如果你用TCP,TCP是一个流协议。你一次Send 50M的数据,并不意味着真的就是用一个50M
的数据包发送的,系统会把它分成多个1500(实际上TCP部分不超过1480,因为IP头最小有20字节)
的包发出去。但是你的TCP缓存小于50M可能就会有问题。最好是一次读比如1024字节的数据,然后
发送,不断地读,同时也不断地发。
 
zw84611,看来你比较熟悉,那有问题指什么问题?比如,串不过去?失败?导致什么后果?
 
没有限制得(除非你大的不可理喻)
 
我没发过这么大的数据,你可以试试呀,一次发50M[:D],如果你的内存够大,配置够好
的话,可能不会有问题。不过这显然不是好办法,你一次要分配50M的内存,大了点,当然几M
应该没问题。
 
呵呵!正么多正确意见!我也说两句,原理上的各位都说得正确,我也就不说了。
但是从编程上看,则要分别对待。

接收方面。接收多大的数据都没问题,
但是注意,在tcp/ip中接收到的数据并不是一次收够你需要的数据才返回,而是收到数据就返回
比如你想调用recv函数一次收50M的数据,那么如果有数据到达,哪怕只是十几个字节,接收函数也会返回。
所以在接受的时候一定要判断收到的数据大小,不够的话要继续收。

发送方面。不可能一次发送过大的数据。
一次调用发送函数发送的数据量大小看操作系统而定(操作系统设置的tcp/ip发送缓冲区),
一次调用send函数发送50M以上的数据肯定出错,因为缓冲区装不下。
所以发送的时候必须一段一段的发。


 
好象我设置缓冲区大小为50M,也没见程序的内存使用量是50M啊,
跟内存有没有关系?
 
问题是你调用用Send(如果用控件,可能是SendBuf或SendStream)函数发送的时候,必须把它
先放在内存中的变量中。
 
那假设我的内存有2G呢,还有没有问题?
 
[:D]够大。如果你有办法把系统的发送缓冲区设得足够大,你的内存够大,理论上没有问题。
但正象我前面说的那样,系统在IP层还是要分段发送的。

另外能否告诉我在windows下如何设定TCP/IP发送缓冲区的,我还不会(没有别的意思,我真的想知道)
 
bs: integer;
bs := 50000 * 1024;
setsockopt(SocketHandle, SOL_SOCKET, SO_SNDBUF, PChar(@bs), sizeof(bs));
setsockopt(SocketHandle, SOL_SOCKET, SO_RCVBUF, PChar(@bs), sizeof(bs));
 
各位继续回答啊
 
没有问题的,TCP会自动给你分段,你不用管。
你也不用担心丢失,TCP 是[red]可靠的[/red]传输协议,会自动重传的。

 
数据包50M一个吧,什么网络允许啊?
TCP能够协商数据包的大小。当打开一个TCP连接时,连接的两端可以传送他们能
够处理的最大数据包大小。但一般环境并不是使用1500字节大小的数据包,而是使用576字
节大小的数据包,因为,任何支持TCP/IP的网络都支持576字节的数据包,不过感觉还是不
怎么懂你的意思,什么你有2G的内存,莫非你要从底层做起么?你应该只需要发你的数据
至于它怎么传送,只要是基于可靠的TCP连接,其它的,要考虑这么多么?
 

Similar threads

后退
顶部