zoukankan      html  css  js  c++  java
  • TCP、UDP的阻塞和非阻塞模式

    前言

    • socket在默认情况下是阻塞状态的,这就使得发送和接受都处于阻塞状态;
    • TCP协议下发送选用send,UDP协议下,发送选用sendto.
    • TCP协议下接收选用recv,UDP协议下,接收选用recvfrom.

    一、阻塞模式&&send

    假设发送缓冲区大小为4096KB,其中已经使用4000KB空间,剩余96KB空间;现在又有200KB的数据需要发送,则只能先将96KB的数据放入发送缓冲区但不发送(阻塞),直到缓冲区空出空间足够放入剩余104KB,再send操作将这200子节发送,返回发送成功字节数200;

    二、非阻塞&&send

    与阻塞不同,非阻塞模式,发送缓冲区得到数据会立即发送,例:当缓冲区只有96KB空间,但要发送200KB数据要进入发送缓冲区,则直接调用send并返回成功字节数96,并不等待将剩余的104字节放入缓冲区同时发送;

    三、阻塞/阻塞模式&&sendto

    UDP的sendto并不能阻塞发送,因为UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区拷贝给下层协议栈,在此过程中加上UDP头,IP头,所以实际不存在阻塞。


    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    四、阻塞模式&&recv

    将会阻塞到发送缓冲区至少 1 个字节,才返回;
    在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。

    五、阻塞模式&& recvfrom

    将会阻塞到发送缓冲区至少一个完整的UDP数据报,才返回;
    在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。

    六、阻塞模式 / 非阻塞模式&&recv

    如果缓冲区 有任何一个字节数据(TCP)或者一个完整UDP数据报,它们将会返回接收到的数据大小。而如果没有任何数据则返回错误 WSAEWOULDBLOCK/E WOULDBLOCK。

  • 相关阅读:
    测试文件报告
    Bug Variations
    阶段一 问答题2
    阶段一 问答题1
    HeapSort
    Git系列 (01):git clone 速度太慢解决方法
    ES6系列 (03):链判断运算符和Null 判断运算符
    ES6系列 (02):解构赋值
    ES6系列 (01):箭头函数this指向问题
    我忘却了所有,抛却了信仰,舍弃了轮回,只为,那曾在佛前哭泣的玫瑰,早已失去旧日的光泽。
  • 原文地址:https://www.cnblogs.com/lidabo/p/14314124.html
Copyright © 2011-2022 走看看