TCP发送速度的控制的问题!重在参与,顶的有分!

SuperKick 2004-03-28 11:22:27
大家在用TCP发送数据的时候一定会遇到这样的问题:发送端发送数据的速度未知,会不会出现接收端来不及接收的问题?如果有的话各位是如何解决这个问题的?最好讲详细一点,包括发送端发送时采用什么策略,接收端采用什么策略,在定义自己的协议包头时的一些注意事项,大家都说一下吧!
...全文
661 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyce 2004-03-31
  • 打赏
  • 举报
回复
我在编TCP的过程中也遇到接受错误的问题
lyce 2004-03-31
  • 打赏
  • 举报
回复
幫你UP
TimLL 2004-03-31
  • 打赏
  • 举报
回复
确实在发送时使用Sleep的方式非常耗费系统资源,尤其是在服务器一端!但每发送一次就等待一次应答是不是将程序的流程搞复杂了?不知有什么比较好的发送算法及接收算法。
ilbj 2004-03-30
  • 打赏
  • 举报
回复
如果你直接用socket编程就不用考虑这个问题
flashboy 2004-03-30
  • 打赏
  • 举报
回复
你们所说的TCP的发送速度控制是传输层的速度控制,但是我想在应用层来进行控制,不知道有没有什么好的办法没有??
SuperKick 2004-03-30
  • 打赏
  • 举报
回复
最后顶一次,没人答就结贴了
tangrh 2004-03-30
  • 打赏
  • 举报
回复
哈哈哈哈
maximin 2004-03-30
  • 打赏
  • 举报
回复
to SuperKick(思考中...勿打扰!): 指教不敢当。就说说个人的见解吧。
大致如下:
每个发送包数据的长度一般为1k,并且有一个自定义结构的控制包头。
struct tagNetHeader
{
DWORD dwID;
DWORD dwTotalLen;
....
};
发送端采用循环发送,直到成功或发生错误
while(1)
{
int nSend = send(...);
if(nSend == -1)
错误码为block;
-->continue,此处不用sleep,直接进行下一次发送操作
否则推出。
}
接收端设计一个算法保证接收包的完整,完整性由tagNetHeader来控制。
uuussseeennn 2004-03-30
  • 打赏
  • 举报
回复
如果采用TCP,缓冲区会被覆盖吗?
TCP有窗口机制,如果数据已经被TCP接受,而应用层未把数据取走,窗口大小会减少,对方会自动减少所要发送的数据量,所以我觉得用TCP不会产生覆盖问题啊,希望高人指教!
mrf2con 2004-03-29
  • 打赏
  • 举报
回复
mscf(扎西特勒):你的等级挺高的,是不是早就在csdn上了?
shenxin197735 2004-03-29
  • 打赏
  • 举报
回复
如果数据被覆盖了那也不是TCP的事
你要解决的问题应当是在用TCP发送数据之前的工作

谁给TCP的数据,你找它去理论吧
shenxin197735 2004-03-29
  • 打赏
  • 举报
回复
硬件的传输也得靠软件来实现,既然支持了TCP,就要遵守TCP的规则

不能把硬件和和软件混淆在一起谈论
shenxin197735 2004-03-29
  • 打赏
  • 举报
回复
看我面子,tcp它不敢收不到
SuperKick 2004-03-29
  • 打赏
  • 举报
回复
再补充一下,以上总结是基于发送端的发送数据速度未知的情况下的总结,实际上很多情况就是这样,大家继续讨论:)
SuperKick 2004-03-29
  • 打赏
  • 举报
回复
呵呵,讨论的人好多,高兴啊。先把上面大家讨论的总结一下:
(1)TCP协议可靠并不等于基于TCP协议的应用可靠,比如会出现发送太快对方来不及接收导致数据被覆盖的情况。
(2)MFC的Socket类在发送时只是拷贝到缓存区内。
大家有没有什么好的方法或策略处理来不及接收的情况?
fengge8ylf 2004-03-29
  • 打赏
  • 举报
回复
想问问大家 recv函数在什么情况下会返回
fengge8ylf 2004-03-29
  • 打赏
  • 举报
回复
数据会在应用层丢失的,在TCP层以及以下层是不会丢失的。如果TCP缓冲区满了,而你应用层没来得及用recv等类似接收函数从TCP缓冲区拷贝数据时,这时如果TCP又有数据到达会把前面来不拷贝的数据“覆盖”掉。还要注意:如果你send了10次 对方可能recv一次就全部接收完毕了。
qiufuwang 2004-03-29
  • 打赏
  • 举报
回复
我推
smallbugworm 2004-03-29
  • 打赏
  • 举报
回复
fengge8ylf 2004-03-29
  • 打赏
  • 举报
回复
哈哈 很简单啊 发送完数据后 等待对方的回复 接收到回复后 再发下一个包
这种办法理论上效率低(因为要等待对方回复,但是想一想,一字节的数据从一台计算机传输到另一台计算机速度是很快的),但是很可靠 很稳定 不会出现数据被冲掉的问题 也不用考虑拆包的问题。
加载更多回复(18)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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