1.每个socket关联了两个缓冲区,一个用于发送,一个用于接收。

2.Udp -内部缓冲区-LMLPHP

3.发送:(1)sendto()把数据放在sendbuf(缓冲区),通知os来取

(2)os在适当的时候过来取数据,并发到网络

这意味着:存入数据和发送数据存在时间差(异步的),如果存入数据太快太多,缓冲区会满

4.    接收:(1)os不停吧从网络上接收数据,缓存在recvbuf里

     (2)recvfrom从缓存区里接收数据

这意味着:不论你是否去取数据,os总是把数据收下来存好,recfrom是从recvbuf里取走现成的数据,如果不及时取走。则缓冲区满

小结:发送和接收是一个异步过程

缓冲区满的处理:

发送:

1)知道缓冲区有剩余空间(阻塞)

2)新发送的数据没有存入缓冲区(直接丢掉)

接收:

1)新的数据不被接收

2)删除缓冲区里的现有的数据,存放新的数据。

丢包对UDP来说是很正常,在使用UDP时就应该允许丢包

05-13 03:14