摘要:
对于实时传输(在这里实时传输主要指交互式视音频,例如视频会议,IM视音频对话等等)来说,数据量有以下两个特点:1.数据是即时产生的,并即时发送,如果数据不能在一个给定的期限内发送完毕,则这部分数据将被丢弃。2.一般来说,单位时间内传输的数据流量比较平滑。TCP依赖滑动窗口进行流量控制,滑动窗口大小是自适应的,影响滑动窗口主要有两个因素,一是网络延时,二是传输速率,滑动窗口的大小与延时成正比,与传输速率也成正比。在给定的网络环境下,延时可以认为是固定的,因此滑动窗口仅与传输速率有关,当传输实时数据时,因为数据流通量比较固定,所以这时TCP上的滑动窗口会处于一个不大不小的固定值,这个值大小恰好保证
阅读全文
posted @ 2012-04-18 17:42
jeffery_lush
阅读(938)
推荐(0)
编辑
摘要:
误区一,使用send函数发送数据一些人使用阻塞的send函数发送数据,这是绝对应该避免的,一旦某一个连接传输发生拥塞,或者突然中断而没有通知,调用send函数的线程将可能被阻塞很长一段时间(可能10秒或更长),尤其是当服务器同时处理成千上万个连接时,这种情况可能会频繁出现。使用非阻塞的send也不适合,数据不一定每次都能完全发送出去,你得使用select跟踪这些socket的发送状态(一旦可能,发送剩余数据),这失去了IOCP的优势。误区二,在多个工作线程的情况下使用PostQueuedCompletionStatus使用PostQueuedCompletionStatus向IOCP发送一个“
阅读全文
posted @ 2012-04-18 17:36
jeffery_lush
阅读(654)
推荐(0)
编辑
摘要:
对每个使用AcceptEx接受的连接套结字使用setsockopt设置SO_UPDATE_ACCEPT_CONTEXT选项,这个选项原义是把listen套结字一些属性(包括socket内部接受/发送缓存大小等等)拷贝到新建立的套结字,却可以使后续的shutdown调用成功。/* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work fine*/setsockopt( sockClient,SOL_SOCKET,SO_UPDATE_ACCEPT_CONTEXT,(char*)&m_sockListen,sizeof(m_s
阅读全文
posted @ 2012-04-18 17:33
jeffery_lush
阅读(334)
推荐(0)
编辑
摘要:
及时监测连接被动关闭除非有特别要求,否则你应该总是对每个连接保持一个挂起的接收pending io(使用WSARecv投递)。如果用户主动关闭连接,你的GetQueuedCompletionStatus调用将返回成功,但接收到的数据长度为0,你能根据这点检测连接是否已被对方关闭。如果连接被重置或者io被取消(如果你调用了CancelIo的话),GetQueuedCompletionStatus将返回失败,注意这时还应该判断GetQueuedCompletionStatus调用返回的lpOverlapped值,如果该值不为NULL,说明iocp已经检测到一个连接已经中断。安全的关闭连接很多人写的
阅读全文
posted @ 2012-04-18 17:33
jeffery_lush
阅读(912)
推荐(0)
编辑