Linux socket非阻塞发送

static int socket_write(int fd, char *buffer, int len)

{

    int ret_len = 0;

    int sub;

    do {

        sub = write(fd, buffer + ret_len, len - ret_len);

        if (sub > 0) {

                ret_len += sub;

        }

        else {

            if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)

                continue;

            else

                return -1;

        }

    } while (ret_len < len);

    return ret_len;

}

这种socket_write函数的设计是为了确保能够尽可能地将给定的数据(buffer)完全写入到套接字(socket)中,即使在这个过程中可能会遇到中断或其他导致write调用返回少于请求字节数的情况。以下是使用这种方式发送数据的一些原因:

  1. 处理非阻塞套接字(Non-blocking sockets)
    当套接字设置为非阻塞模式时,如果数据不能立即发送(例如,由于网络拥塞或接收端缓冲区已满),write调用可能会返回EWOULDBLOCKEAGAIN错误。通过在循环中重试write调用,此函数允许非阻塞套接字在准备好发送更多数据时继续发送数据。

  2. 处理被中断的系统调用(Interrupted system calls)
    如果一个write调用被信号中断(例如,由于程序接收到了信号),它会返回-1并设置errnoEINTR。通过检查这个错误并重新尝试write调用,这个函数可以处理这种中断情况。

  3. 确保数据的完整发送
    由于网络或操作系统的各种因素,write调用可能无法一次发送所有请求的数据。通过在循环中调用write,并更新发送的字节数(ret_len),这个函数确保所有数据都被发送,直到达到请求的长度(len)或遇到不可恢复的错误为止。

  4. 错误处理
    除了EINTREWOULDBLOCKEAGAIN之外,如果write调用返回-1并设置了其他errno值,这通常表示发生了不可恢复的错误(如EBADFENOMEM等)。在这种情况下,函数返回-1,表明发生了错误。

  5. 灵活性
    此函数适用于阻塞和非阻塞套接字,增加了代码的灵活性和可重用性。

  6. 性能考虑
    虽然这种方法的性能可能不如单个write调用(如果数据可以一次发送),但在某些情况下(如网络拥塞或套接字为非阻塞模式),它可以提供更好的整体性能和响应性。

总之,这种设计允许函数更健壮地处理各种可能的网络条件和错误情况,并确保数据的完整发送。

相关推荐

  1. Linux socket阻塞发送

    2024-06-08 10:40:03       21 阅读
  2. 阻塞IO

    2024-06-08 10:40:03       34 阅读
  3. 7.阻塞模式与阻塞模式

    2024-06-08 10:40:03       34 阅读
  4. NIO之阻塞模式

    2024-06-08 10:40:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 10:40:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 10:40:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 10:40:03       87 阅读
  4. Python语言-面向对象

    2024-06-08 10:40:03       96 阅读

热门阅读

  1. 【C语言进阶】--- 字符串函数与内存函数

    2024-06-08 10:40:03       27 阅读
  2. C++自定义list实现

    2024-06-08 10:40:03       25 阅读
  3. 常见名词之时间戳

    2024-06-08 10:40:03       28 阅读
  4. 第49集《摄大乘论》

    2024-06-08 10:40:03       20 阅读
  5. 列举Spring的IoC和AOP的特点

    2024-06-08 10:40:03       23 阅读
  6. #06 掌握Stable Diffusion:自定义模型训练步骤

    2024-06-08 10:40:03       28 阅读
  7. 「前端+鸿蒙」鸿蒙应用开发预览&模拟器运行

    2024-06-08 10:40:03       28 阅读
  8. SpringEvent事件发布&订阅Demo

    2024-06-08 10:40:03       24 阅读
  9. Dart语言中mixins的使用

    2024-06-08 10:40:03       26 阅读
  10. TS 系列:使用元祖生成联合类型

    2024-06-08 10:40:03       28 阅读
  11. 【无标题】

    2024-06-08 10:40:03       26 阅读
  12. CISSP—实现安全治理和原则的策略

    2024-06-08 10:40:03       24 阅读