在弄完成端口时不得不面对这些问题,本来网络就是本瓶醋菜鸟,知道的东西很少,实际用起来真是有不少的阻力,拿书来看是来不及了,想找send和recv的源码,发现时dll和lib里的,经过一周的奋斗,对socket有点初步的了解了,先说一下个人浅见:
在解释前首先做一下声明,不怀疑通信质量问题,也就是说只要是由相关硬件发给已连接的另一端的数据是一定可以到达另一端连接者的硬件的。
下面:
我认为send和recv本来是非阻塞的,因为这是它们的最简单形式。
首先谈非阻塞,send向硬件发出一个发送数据的命令,硬件可以准确无误的把这些数据发送给另一端A,而send仅仅发送这样一个命令就可以返回了,且指定数据已经准确到达了另一端A,不过与阻塞不同的是send返回时不知道A有没有调用recv来接受数据,所谓的recv接受数据只不过是在本地相关硬件的内存里面取出数据,实现过程并不存在远程的数据传输,数据在本地内存的逻辑存储应该是一个队列,非阻塞的recv仅仅检测和取出这个本地队列里是否有数据(这些数据来自建立连接的另一端),并返回取出的数据量(字节数),如果本地仍未收到任何数据则返回0字节,表示本地没有收到数据。
阻塞模式的send不仅仅向硬件发出一个发送数据的命令内部还有一个recv等待,并且是循环等待,直到收到另一端A send出来的确认消息才返回,而A端那个send出来的消息正好就是阻塞的recv发出的,阻塞的recv的实现实际上已经在阻塞send中提及了,对了就是一个循环recv等待消息,当检测到本地队列中有发送端发来数据的时候才send确认并返回。
最后说明一下这个recv检测的队列,确认发送成功消息应该有一个识别方式,可能是数据内部的识别,也可能是被指定发送到了不同的队列,不过最终还都是数据的识别。
总述:send和recv在执行的时候并没有直接的给远程发送或在远程接受数据的这个过程,这些都是由系统内部完成的,所以可以这样理解:若在一个存在的连接上调用了send函数给另一端A,即使A没有调用recv取数据,数据也已经到达了A了。
本文探讨了非阻塞与阻塞模式下socket通信的工作原理。作者从send与recv函数的角度出发,详细阐述了这两种模式下数据如何在本地与远程间进行传输。非阻塞模式下send仅发送数据命令并立即返回,recv检测本地队列中的数据;而在阻塞模式下,send会等待对方确认接收后再返回。
1047

被折叠的 条评论
为什么被折叠?



