一直从事高性能高并发服务器研究
2013年(28)
分类: LINUX
2013-09-25 22:55:31
场景1,我们继续图4这个例子,不过这儿开始我们就跳出图4所示的过程了
22. 接收端sleep(1000)到时间了,进程被唤醒,代码片段如图5
实际上理解了阻塞式的,就能理解非阻塞的。
jackydi2018-02-28 10:01:06
maoyg94:楼主你好:你的文章很有内涵,理清了很多重要概念,但还有一些疑问向楼主请教:
对图4的分析中的第20条,send()要发送的数据是70k,现在发出去了66800字节,发送缓存中还有16k,应用层剩余要拷贝进内核的数据量是N=70k-66800-16k。
对这句话的疑问是:
1、发送缓存中还有16k,是指服务器端的socket的发送缓冲区?这些数据是没发送出去的?
2、应用层剩余要拷贝进内核的数据量是N=70k-66800-16k,但计算结果N是负数=71680-66800-16384?
3、阻塞下send函数何时能返回?就本例来讲,send函数能成功返回,就算接收端一直不调用recv?
说下我的理解:
1. 这个缓存应该是指发送端应用程序的缓存,这些数据还没有写入到内核的发送缓冲区中。
2. 这里应该是笔误,应该是N=70K-66800=16K
3. 如果接收端一直不调用recv,send()函数也不会一直阻塞,因为TCP协议本身还有一个超时机制,超时后就自动断开连接了,此时send()应该会返回错误。这是我的理解,不知道是否正确,希望有大神来详细解释一下。
maoyg942017-01-02 16:28:42
楼主你好:你的文章很有内涵,理清了很多重要概念,但还有一些疑问向楼主请教:
对图4的分析中的第20条,send()要发送的数据是70k,现在发出去了66800字节,发送缓存中还有16k,应用层剩余要拷贝进内核的数据量是N=70k-66800-16k。
对这句话的疑问是:
1、发送缓存中还有16k,是指服务器端的socket的发送缓冲区?这些数据是没发送出去的?
2、应用层剩余要拷贝进内核的数据量是N=70k-66800-16k,但计算结果N是负数=71680-66800-16384?
3、阻塞下send函数何时能返回?就本例来讲,send函数能成功返回,就算接收端一直不调用recv?